@szegedsw/lib-node
Version:
A little framework published by Szeged Software Zrt. in order to enhance api endpoint security and create reuseable code. Email module, Logging system, and much more. Further improvements are expected.
96 lines • 4.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildRouter = exports.Routed = void 0;
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
/* eslint-disable no-shadow */
const express_1 = require("express");
const config_1 = require("../config/config");
const controller_class_1 = require("../controller/controller.class");
const try_1 = require("../functions/try");
const request_1 = require("./request");
const logger_1 = require("../logger/logger");
class Routed {
constructor() {
Object.defineProperty(this, "errors", {
enumerable: true,
configurable: true,
writable: true,
value: {}
});
Object.defineProperty(this, "splitter", {
enumerable: true,
configurable: true,
writable: true,
value: "#"
});
Object.defineProperty(this, "onError", {
enumerable: true,
configurable: true,
writable: true,
value: async () => undefined
});
}
toRouter() {
const router = express_1.Router();
const tryIt = (req, res, func) => try_1._try(res, async () => func(req, res, request_1.requestParams(req)), this.errors, this.onError, this.splitter);
router.get("/", async (req, res) => tryIt(req, res, (req, res, data) => this.get(req, res, data)));
router.get("/:_id", async (req, res) => tryIt(req, res, (req, res, data) => this.get(req, res, data)));
router.post("/", async (req, res) => tryIt(req, res, (req, res, data) => this.post(req, res, data)));
router.patch("/", async (req, res) => tryIt(req, res, (req, res, data) => this.patch(req, res, data)));
router.patch("/:_id", async (req, res) => tryIt(req, res, (req, res, data) => this.patch(req, res, data)));
router.put("/", async (req, res) => tryIt(req, res, (req, res, data) => this.put(req, res, data)));
router.put("/:_id", async (req, res) => tryIt(req, res, (req, res, data) => this.put(req, res, data)));
router.delete("/", async (req, res) => tryIt(req, res, (req, res, data) => this.delete(req, res, data)));
router.delete("/:_id", async (req, res) => tryIt(req, res, (req, res, data) => this.delete(req, res, data)));
return router;
}
}
exports.Routed = Routed;
function guardsToMiddleware(controller) {
// tslint:disable-next-line: no-console
return async (req, res, next) => {
if (["GET", "POST", "PATCH", "PUT", "DELETE"].every((method) => {
const guard = controller[`${method.toLowerCase()}Guard`];
if (req.method === method && (guard === null || guard === void 0 ? void 0 : guard(req, res)) === false) {
res.status(controller.notAcceptableCode || config_1.HttpCodes.notAcceptable).end();
return false;
}
return true;
})) {
next();
}
};
}
function validatorToMiddleware(controller) {
return async (req, res, next) => {
if (!(await controller.validator(req, res))) {
// tODO visszaadni innen, most a validator leküldi
// res.status(controller.unprocessableEntityCode || HttpCodes.unprocessableEntity).end();
return;
}
next();
};
}
function buildRouter(routes, wares = []) {
const router = express_1.Router();
routes.forEach((route) => {
const middlewares = route.middlewares ? wares.concat(route.middlewares) : wares;
if (route.handler instanceof controller_class_1.Controller) {
router.use(route.path, [...middlewares, guardsToMiddleware(route.handler), validatorToMiddleware(route.handler)], route.handler.toRouter());
}
else if (route.handler && Array.isArray(route.handler)) {
if (route.path.length > 0) {
router.use(route.path, middlewares, buildRouter(route.handler));
}
else {
router.use(buildRouter(route.handler, middlewares));
}
}
else {
logger_1.Logger.error("Improper route", JSON.stringify(route));
}
});
return router;
}
exports.buildRouter = buildRouter;
//# sourceMappingURL=router.js.map