63 lines
1.8 KiB
JavaScript
63 lines
1.8 KiB
JavaScript
'use strict'
|
|
|
|
module.exports = validate
|
|
|
|
const set = require('lodash/set')
|
|
const HttpError = require('../../request/http-error')
|
|
|
|
function validate (endpointParams, options) {
|
|
Object.keys(endpointParams).forEach(parameterName => {
|
|
const parameter = endpointParams[parameterName]
|
|
const expectedType = parameter.type
|
|
let value = options[parameterName]
|
|
|
|
const paramIsPresent = parameterName in options
|
|
const paramIsNull = value === null
|
|
|
|
if (!parameter.required && !paramIsPresent) {
|
|
return
|
|
}
|
|
|
|
if (parameter['allow-null'] === true && paramIsNull) {
|
|
return
|
|
}
|
|
|
|
if ((parameter.required && !paramIsPresent) ||
|
|
(parameter['allow-null'] === false && paramIsNull)) {
|
|
throw new HttpError(`Empty value for parameter '${parameterName}': ${value}`, 400)
|
|
}
|
|
|
|
if (parameter.enum) {
|
|
if (parameter.enum.indexOf(value) === -1) {
|
|
throw new HttpError(`Invalid value for parameter '${parameterName}': ${value}`, 400)
|
|
}
|
|
}
|
|
|
|
if (parameter.validation) {
|
|
const regex = new RegExp(parameter.validation)
|
|
if (!regex.test(value)) {
|
|
throw new HttpError(`Invalid value for parameter '${parameterName}': ${value}`, 400)
|
|
}
|
|
}
|
|
|
|
if (expectedType === 'number') {
|
|
value = parseInt(value, 10)
|
|
if (isNaN(value)) {
|
|
throw new HttpError(`Invalid value for parameter '${parameterName}': ${options[parameterName]} is NaN`, 400)
|
|
}
|
|
}
|
|
|
|
if (expectedType === 'json' && typeof value === 'string') {
|
|
try {
|
|
value = JSON.parse(value)
|
|
} catch (exception) {
|
|
throw new HttpError(`JSON parse error of value for parameter '${parameterName}': ${value}`, 400)
|
|
}
|
|
}
|
|
|
|
set(options, parameter.mapTo || parameterName, value)
|
|
})
|
|
|
|
return options
|
|
}
|