UNPKG

dinoloop-es8

Version:

A lightweight REST API Library for building scalable Node.js server-side applications powered by Typescript

160 lines 14.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const utility_1 = require("../utility"); const entities_1 = require("../entities"); class DinoController { constructor(controller, controllerAction) { this.controller = controller; this.controllerAction = controllerAction; } // made public for unit-test, not available on contract // gets query string object and maps the value with corresponding key // for (@QueryParam() id) returns { id: 45 } getQueryParams() { let queryParams = this.controllerAction .actionAttributes .actionArguments .map(x => x.isQueryParam ? x.key : null) .filter(x => !utility_1.DataUtility.isNull(x)); let queryString = {}; for (const queryParam of queryParams) { // create new object, key = value queryString[queryParam] = this.controller.request.query[queryParam]; } return queryString; } // made public for unit-test, not available on contract // maps url-segments and query-strings mapSegments(params, requestUrl) { return utility_1.RouteUtility.mapSegmentsAndQueryToActionArguments(requestUrl, this.controller.request.path, this.getQueryParams(), params); } // made public for unit-test, not available on contract // invokes handlers for segments and query params raiseActionParamsHandlers(values) { let attr = this.controllerAction.actionAttributes; // if request has http-body then ignore first param // since it is handled by .handleHttpBody() const parseParams = utility_1.HttpUtility.hasBody(attr.httpVerb) ? attr.actionArguments.filter(x => x.paramIndex !== 0) : attr.actionArguments; for (const param of parseParams) { for (const value of values) { if (param.key === value.key) { value.value = param.handler({ action: param.action, controller: param.controller, key: param.key, data: param.data, value: value.value }, this.controller.model); } } } } // made public for unit-test, not available on contract // invokes handler only for http-body handleHttpBody(values) { let attr = this.controllerAction.actionAttributes; // If http-request has body, first parameter gets request-body injected if (utility_1.HttpUtility.hasBody(attr.httpVerb)) { // http-body injected to first parameter i.e. index == 0 let arg = attr.actionArguments .filter(x => x.paramIndex === 0)[0]; if (utility_1.DataUtility.isUndefined(arg)) { values[0] = { value: this.controller.request.body }; } else { values[0] = { key: arg.key }; values[0].value = arg.handler({ action: arg.action, controller: arg.controller, key: arg.key, data: arg.data, value: this.controller.request.body }, this.controller.model); } } } // made public for unit test and not available on interface contract // result returned by action method, makes available to next middleware attachResultToDino(sendsResponse, result) { // if action is not decorated with SendsResponse // just capture and attach the result to dino property if (sendsResponse === false) { // conversion is required to access result property, // which actually exists on DinoResponse let dino = this.controller.dino; dino.result = result; this.controller.next(); } } patch(req, res, next) { this.controller.request = req; this.controller.response = res; this.controller.next = next; this.controller.dino = res.locals.dino; this.controller.model = new entities_1.DinoModel(); // typically when action is decorated with @SendsResponse // and if any error occurred inside the callback processing handler, // its better to invoke "this.dino.throw(ex)" in action methods to bubble the error // onto next error middleware. user can also perform next(err), // both does the same and .throw() just provides consistent dino api this.controller.dino.throw = (err) => { this.controller.next(err); }; // typically when action is decorated with @SendsResponse // and user still wants the result to be available for the next middlewares in the chain. // invoke "this.dino.proceed(result)" which adds result to dino property, // which is then used by result filters. this.controller.dino.proceed = (result) => { // conversion required to access result property // which does actually exists on DinoResponse let dino = this.controller.dino; dino.result = result; this.controller.next(); }; } invokeSetUp(actionName) { let ctx = this.controller; let cta = this.controllerAction; let values = []; let params = utility_1.FunctionUtility.getParamNames(ctx[actionName]); if (params.length > 0) { values = this.mapSegments(params, cta.actionAttributes.route); this.handleHttpBody(values); this.raiseActionParamsHandlers(values); } return values; } // If controller action is synchronous - invoke this invoke(actionName) { let ctx = this.controller; let values = this.invokeSetUp(actionName); let result = values.length > 0 ? ctx[actionName].apply(ctx, values.map(val => val.value)) : ctx[actionName](); this.attachResultToDino(this.controllerAction.actionAttributes.sendsResponse, result); } // if controller action is async - invoke this async invokeAsync(actionName) { try { let ctx = this.controller; let values = this.invokeSetUp(actionName); let result = values.length > 0 ? await ctx[actionName].apply(ctx, values.map(val => val.value)) : await ctx[actionName](); this.attachResultToDino(this.controllerAction.actionAttributes.sendsResponse, result); } catch (ex) { this.controller.next(ex); } } static create(controller, controllerAction) { return new DinoController(controller, controllerAction); } } exports.DinoController = DinoController; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGluby5jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZHVsZXMvY29yZS9kaW5vLmNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFRQSx3Q0FLb0I7QUFDcEIsMENBQXdDO0FBR3hDO0lBS0ksWUFBWSxVQUF5QixFQUNqQyxnQkFBa0M7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO0lBQzdDLENBQUM7SUFFRCx1REFBdUQ7SUFDdkQscUVBQXFFO0lBQ3JFLDRDQUE0QztJQUM1QyxjQUFjO1FBQ1YsSUFBSSxXQUFXLEdBQ1gsSUFBSSxDQUFDLGdCQUFnQjthQUNoQixnQkFBZ0I7YUFDaEIsZUFBZTthQUNmLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUN2QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLHFCQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFN0MsSUFBSSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRXJCLEtBQUssTUFBTSxVQUFVLElBQUksV0FBVyxFQUFFO1lBQ2xDLGlDQUFpQztZQUNqQyxXQUFXLENBQUMsVUFBVSxDQUFDO2dCQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDakQ7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUN2QixDQUFDO0lBRUQsdURBQXVEO0lBQ3ZELHNDQUFzQztJQUN0QyxXQUFXLENBQ1AsTUFBZ0IsRUFDaEIsVUFBa0I7UUFDbEIsT0FBTyxzQkFBWSxDQUFDLG9DQUFvQyxDQUFDLFVBQVUsRUFDL0QsSUFBSSxD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