UNPKG

apeman-app-validate

Version:
64 lines (56 loc) 1.83 kB
/** * apeman app to do schema validation. * @function apemanAppValidate * @param {object} schema - A json schema object. * @param {object} [options] - Optional settings. * @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 co = require('co') 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 statusCode = options.statusCode || 400 let prefix = options.prefix || 'ap' let namespace = options.namespace || '/data/attributes' let app = co.wrap(function * validateApp (ctx, next) { let { body } = ctx.request let data = parseData(body, namespace) let errors = validateData(data, schema, { namespace }) if (errors) { let locale = apemanlocale.locale(ctx.locale()) ctx.status = statusCode ctx.set(`${prefix}-validate`, 'invalid') ctx.body = { errors: [].concat(errors).map((errors) => app.parseErrors(errors, locale) ).reduce((a, b) => [].concat(a, b), []), meta: { schema } } } else { ctx.set(`${prefix}-validate`, 'valid') yield next() } }) Object.assign(app, { validateData, parseData, parseErrors, // Description of this app. $desc: 'Validate with json schema.' }) return app } module.exports = create