UNPKG

apeman-app-validate

Version:
77 lines (67 loc) 2.4 kB
/** * apeman app to do schema validation. * @function apemanAppValidate * @param {object} schema - A json schema object. * @param {object} [options] - Optional settings. * @param {string} [options.format] - Response format like "json", "xml", etc. * @param {string} [options.statusCode=400] - Status code for error response. * @param {string} [options.prefix='ap'] - Prefix for response header field. * @param {string} [options.namespace='data'] - Name space of data in body. * @returns {function} - Defined app function. */ 'use strict' const assert = require('assert') const apemanlocale = require('apemanlocale') const validateData = require('./validating/validate_data') const parseData = require('./parsing/parse_data') const parseErrors = require('./parsing/parse_errors') /** @lends create */ function create (schema, options = {}) { if (!schema) { throw new Error('schema is required.') } let format = options.format let statusCode = options.statusCode || 400 let prefix = options.prefix || 'ap' let namespace = options.namespace || '/data/attributes' /** * Defined app. * @function app * @param {object} req - Request object. * @param {object} res - Response object. * @param {function} next - Pass to next handler. */ function app (req, res, next) { assert(req.locale, 'req.locale not found. Use "apeman-app-locale" before this.') assert(req.body, 'res.body not found. Use "apeman-app-form" before this.') assert(res.send, 'res.send not found. Use "apeman-app-send" before this.') assert(res.header, 'res.header not found. Use "apeman-app-header" before this.') let data = parseData(req.body, namespace) let errors = validateData(data, schema, { namespace }) if (errors) { let locale = apemanlocale.locale(req.locale()) res.statusCode = statusCode res.header(`${prefix}-validate`, 'invalid') res.send({ errors: [].concat(errors).map((errors) => app.parseErrors(errors, locale) ).reduce((a, b) => [].concat(a, b), []), meta: { schema } }, format) } else { res.header(`${prefix}-validate`, 'valid') next() } } Object.assign(app, { validateData, parseData, parseErrors, // Description of this app. $desc: 'Validate with json schema.' }) return app } module.exports = create