@enviabybus/express-validation
Version:
express-validation is a middleware that validates a request and returns a response with errors; if any of the configured validation rules fail.
37 lines (28 loc) • 1.34 kB
JavaScript
const Joi = require('joi');
const ValidationError = require('./validation-error');
const { mergeJoiOptions, joiSchema } = require('./joi');
const { mergeEvOptions, evSchema } = require('./ev');
const { parameters } = require('./parameters');
const { handleMutation } = require('./mutation');
const { clean, keyByField } = require('./reducers');
exports.validate = (schema = {}, options = {}, joi = {}) => {
Joi.assert(options, evSchema);
Joi.assert(schema, joiSchema);
return (request, response, next) => {
const evOptions = mergeEvOptions(options);
const joiOptions = mergeJoiOptions(joi, options.context, request);
const validate = (parameter) => schema[parameter].validateAsync(request[parameter], joiOptions)
.then(result => handleMutation(request[parameter], result.value, evOptions.context))
.catch(error => ({ [parameter]: error.details }));
const hasErrors = (errors) => (errors ? new ValidationError(errors, evOptions) : null);
const promises = parameters
.filter(parameter => request[parameter] && schema[parameter])
.map(parameter => validate(parameter));
return Promise.all(promises)
.then(e => clean(e))
.then(e => keyByField(e, options.keyByField))
.then(r => next(hasErrors(r)));
};
};
exports.ValidationError = ValidationError;
exports.Joi = Joi;