From 90f724afc62b57deaac1ef2a695d97d6468c9286 Mon Sep 17 00:00:00 2001 From: Lench Volodymyr Date: Mon, 5 Jul 2021 12:14:21 +0300 Subject: [PATCH] add validating path parameters --- .../helpers/validationHelper.js | 72 ++++++++++++++++--- 1 file changed, 63 insertions(+), 9 deletions(-) diff --git a/forward_engineering/helpers/validationHelper.js b/forward_engineering/helpers/validationHelper.js index f0df71c..27d886d 100644 --- a/forward_engineering/helpers/validationHelper.js +++ b/forward_engineering/helpers/validationHelper.js @@ -46,9 +46,28 @@ const getInnerErrors = (inner, depth = 0) => { const uniqStrings = (items) => Object.keys(items.reduce((result, item) => Object.assign({}, result, { [item]: '' }), {})); +const getValidatorErrors = (error) => { + if (!error) { + return []; + } + + if (Array.isArray(error.details)) { + return error.details.map(getError); + } else { + return [{ + type: 'error', + label: error.name, + title: error.message, + context: '' + }]; + } +}; + const validate = (script, options = {}) => new Promise((resolve, reject) => { SwaggerParser.validate(script, options, (err, api) => { - if (!err) { + const errors = getValidatorErrors(err).concat(checkPathParameters(script)); + + if (errors.length === 0) { return resolve([{ type: 'success', label: '', @@ -59,19 +78,54 @@ const validate = (script, options = {}) => new Promise((resolve, reject) => { basePath: api.basePath } }]); - } else if (Array.isArray(err.details)) { - resolve(err.details.map(getError)); } else { - resolve([{ - type: 'error', - label: err.name, - title: err.message, - context: '' - }]); + resolve(errors); } }); }); +const getPathParameters = (pathName) => { + const regExp = /\{([\s\S]+?)\}/; + + return (pathName.match(new RegExp(regExp, 'g')) || []).map((parameter) => { + return parameter.match(regExp)[1]; + }); +}; + +const createPathParameterError = (pathName, parameter) => { + return { + type: 'error', + label: 'Semantic Error', + title: 'Semantic error at ' + `paths.${pathName}`, + context: `Declared path parameter "${parameter}" needs to be defined as a path parameter at either the path or operation level` + }; +}; + +const checkPathParameters = (schema) => { + return Object.keys(schema.paths).reduce((errors, pathName) => { + const pathParameters = getPathParameters(pathName); + const requests = schema.paths[pathName] || {}; + + return pathParameters.reduce((errors, parameter) => { + return Object.keys(requests).reduce((errors, requestName) => { + const request = requests[requestName]; + + if (!Array.isArray(request.parameters)) { + return errors.concat(createPathParameterError(pathName, parameter)); + } + + const param = request.parameters.find((param) => param.name === parameter && param.in === 'path'); + + if (param) { + return errors; + } + + return errors.concat(createPathParameterError(pathName, parameter)); + }, errors); + }, errors); + }, []); +}; + module.exports = { validate };