@tdsoft/express-routing-wrapper
Version:
Package gives you level of abstraction/wrapping of express router(s), endpoints and middlewares, additionally defining subrouters makes tree structure possible and easily discoverable by root router.
65 lines (55 loc) • 2.32 kB
JavaScript
const logger = console; // temporary
const _ = require("lodash");
const createError = require("http-errors");
// TODO: Refactor most of the code to some Validation utils, etc.
// * prevalidate request
// * checkRequiredParams...
class ApiMiddleware {
constructor({
access, method,
reqBody, reqCookies, reqDbModel, reqHeaders, reqPath, reqQuery,
resBody, resCookies, resDbModel
},
cb = () => logger.warn("Middleware has no cb provided!")) {
this.def = {method};
this.def.access = {...access};
this.def.req = {body: reqBody, dbModel: reqDbModel, query: reqQuery, cookies: reqCookies, headers: reqHeaders, path: reqPath};
this.def.res = {body: resBody, dbModel: resDbModel, cookies: resCookies};
this.cb = cb;
}
async expressFn(req, res, next) {
const credentials = await this._checkAccessRights(req, res, next);
if (credentials.err) return;
const errorMsgs = [
...this.checkBodyParams(req),
...this.checkQueryParams(req),
];
if (errorMsgs.length) {
next(createError.BadRequest(errorMsgs.join("</br>\n")));
} else return this.cb(req, res, next)
.catch(err => next(err));
}
async _checkAccessRights(req, res, next) {
const {access} = this.def;
if (access && access.level && access.cb) {
return await access.cb(req, res, next, access.level);
}
return {};
}
_checkRequiredParams(reqAcess, paramsObj, paramsDesc = "") {
const reqBodyFields = _.chain(paramsObj)
.reduce((reducer, v, field) => [...reducer, (v.required && field)], [])
.compact().value();
//.map((v, key) => key);
const notPassedFields = reqBodyFields.reduce((reducer, field) => (reqAcess[field]) ? reducer :
[...reducer, `Passed${paramsDesc} parameters don't contain required "${field}" field.`], []);
return notPassedFields;
}
checkBodyParams(req) {
return this._checkRequiredParams(req.body, this.def.body, " body");
}
checkQueryParams(req) {
return this._checkRequiredParams(req.query, this.def.query, " query");
}
}
module.exports = ApiMiddleware;