apeman-app-validate
Version:
apeman app to do schema validation.
77 lines (67 loc) • 2.4 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.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.
*/
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