Skip to content

Commit 90f724a

Browse files
add validating path parameters
1 parent ab2600f commit 90f724a

File tree

1 file changed

+63
-9
lines changed

1 file changed

+63
-9
lines changed

forward_engineering/helpers/validationHelper.js

Lines changed: 63 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,28 @@ const getInnerErrors = (inner, depth = 0) => {
4646

4747
const uniqStrings = (items) => Object.keys(items.reduce((result, item) => Object.assign({}, result, { [item]: '' }), {}));
4848

49+
const getValidatorErrors = (error) => {
50+
if (!error) {
51+
return [];
52+
}
53+
54+
if (Array.isArray(error.details)) {
55+
return error.details.map(getError);
56+
} else {
57+
return [{
58+
type: 'error',
59+
label: error.name,
60+
title: error.message,
61+
context: ''
62+
}];
63+
}
64+
};
65+
4966
const validate = (script, options = {}) => new Promise((resolve, reject) => {
5067
SwaggerParser.validate(script, options, (err, api) => {
51-
if (!err) {
68+
const errors = getValidatorErrors(err).concat(checkPathParameters(script));
69+
70+
if (errors.length === 0) {
5271
return resolve([{
5372
type: 'success',
5473
label: '',
@@ -59,19 +78,54 @@ const validate = (script, options = {}) => new Promise((resolve, reject) => {
5978
basePath: api.basePath
6079
}
6180
}]);
62-
} else if (Array.isArray(err.details)) {
63-
resolve(err.details.map(getError));
6481
} else {
65-
resolve([{
66-
type: 'error',
67-
label: err.name,
68-
title: err.message,
69-
context: ''
70-
}]);
82+
resolve(errors);
7183
}
7284
});
7385
});
7486

87+
const getPathParameters = (pathName) => {
88+
const regExp = /\{([\s\S]+?)\}/;
89+
90+
return (pathName.match(new RegExp(regExp, 'g')) || []).map((parameter) => {
91+
return parameter.match(regExp)[1];
92+
});
93+
};
94+
95+
const createPathParameterError = (pathName, parameter) => {
96+
return {
97+
type: 'error',
98+
label: 'Semantic Error',
99+
title: 'Semantic error at ' + `paths.${pathName}`,
100+
context: `Declared path parameter "${parameter}" needs to be defined as a path parameter at either the path or operation level`
101+
};
102+
};
103+
104+
const checkPathParameters = (schema) => {
105+
return Object.keys(schema.paths).reduce((errors, pathName) => {
106+
const pathParameters = getPathParameters(pathName);
107+
const requests = schema.paths[pathName] || {};
108+
109+
return pathParameters.reduce((errors, parameter) => {
110+
return Object.keys(requests).reduce((errors, requestName) => {
111+
const request = requests[requestName];
112+
113+
if (!Array.isArray(request.parameters)) {
114+
return errors.concat(createPathParameterError(pathName, parameter));
115+
}
116+
117+
const param = request.parameters.find((param) => param.name === parameter && param.in === 'path');
118+
119+
if (param) {
120+
return errors;
121+
}
122+
123+
return errors.concat(createPathParameterError(pathName, parameter));
124+
}, errors);
125+
}, errors);
126+
}, []);
127+
};
128+
75129
module.exports = {
76130
validate
77131
};

0 commit comments

Comments
 (0)