BohemiaInteractive/bi-service

View on GitHub
lib/middleware/validator.js

Summary

Maintainability
A
3 hrs
Test Coverage
const ValidationCompoundError = require('../error/validationCompoundError.js');

/*
 * @param {string|Object} valDef - string => registered schema id. Object => schema definition
 * @param {string}  dataProp - query|body|params
 * @return {Function}
 * @throws {ValidationError}
 */
module.exports = function(valDef, dataProp) {

    const validator = this.Router.App.getValidator();
    const ErrorConstructor = validator.ValidationErrorConstructor;
    var validate;

    if (typeof dataProp !== 'string' || !dataProp) {
        throw new Error('Invalid target data property argument: `dataProp`. Expected a string.');
    }

    if (typeof valDef === 'object' && valDef !== null) {
        validate = validator.compile(valDef);
    } else {
        validate = validator.getSchema(valDef);
    }

    if (typeof validate !== 'function') {
        throw new Error(`No validator for ${valDef} exists`);
    }

    return function validationMiddleware(req, res) {

        if (validate(req[dataProp])) {
            return null;
        }

        let err;

        if (ValidationCompoundError === ErrorConstructor
            || ValidationCompoundError.prototype.isPrototypeOf(
                ErrorConstructor.prototype
            )
        ) {
            err = validate.errors;
        } else {
            err = validate.errors.shift();

            if (err && !err.dataPath) {
                err.dataPath = '<' + dataProp + '>';
            }
        }

        throw new ErrorConstructor(err);
    };
};