Skip to content

Instantly share code, notes, and snippets.

@tshaddix
Last active March 31, 2016 14:59
Show Gist options
  • Save tshaddix/4fad99124e800d1ed8f7 to your computer and use it in GitHub Desktop.
Save tshaddix/4fad99124e800d1ed8f7 to your computer and use it in GitHub Desktop.
The simplest service strictifier ever
import Joi from 'joi';
import _ from 'lodash';
import {
BadRequestError
} from './errors';
const _promisedValidate = (msg, schema) => {
return new Promise((resolve, reject) => {
Joi.validate(msg, schema, {
stripUnknown: true
}, (err, value) => {
if (err) {
reject(new BadRequestError(err.details[0].message, err.details[0].path));
} else {
resolve(value);
}
});
});
};
const optsSchema = Joi.object().keys({
reqSchema: Joi.object().required(),
resSchema: Joi.object().required(),
handler: Joi.func().required()
});
export default (opts) => {
const result = Joi.validate(opts, optsSchema);
if (result.error) {
throw error;
}
const o = result.value;
return (req, res, next) => {
const reqContent = _.extend({}, req.body, req.query, req.params);
const ctx = {req, res};
_promisedValidate(reqContent, o.reqSchema)
.then((reqMsg) => {
return o.handler(reqMsg, ctx);
})
.then((resMsg) => {
return _promisedValidate(resMsg, o.resSchema);
})
.then((data) => {
res.json(data);
})
.catch((err) => {
next(err);
});
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment