dinoloop-es8
Version:
A lightweight REST API Library for building scalable Node.js server-side applications powered by Typescript
160 lines • 14.1 kB
JavaScript
"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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