apeman-app-validate
Version:
apeman app to do schema validation.
64 lines (56 loc) • 1.83 kB
JavaScript
/**
* 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.
*/
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