UNPKG

mission.api

Version:
124 lines 6.09 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const mpath = require("mpath"); const decorators_1 = require("../decorators"); const vendor_1 = require("../vendor"); let FacadeController = class FacadeController { static getData(req, res, next) { return __awaiter(this, void 0, void 0, function* () { const reqs = req.body; const reqGroup = vendor_1._.groupBy(reqs, (gReq) => vendor_1._.some(gReq.request.filters, 'jPath') ? 'dependent' : 'independent'); let outval = yield FacadeUtil.retrive(req, res, next, reqGroup['independent'], {}); let nextReq = reqGroup['dependent'] || []; let nextExeCnt = nextReq.length; while (nextReq.length > 0) { const reqDict = FacadeUtil.splitNextExeReq(nextReq, outval); outval = yield FacadeUtil.retrive(req, res, next, reqDict['current'] || [], outval); nextReq = reqDict['next'] || []; if (nextReq.length === nextExeCnt) { vendor_1._.forEach(nextReq, (r) => vendor_1._.merge(outval, { [r.key]: { Error: 'JPath Key is not found in the response object' }, })); nextReq = []; } nextExeCnt = nextReq.length; } return outval; }); } }; __decorate([ decorators_1.Post(), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, Object, Function]), __metadata("design:returntype", Promise) ], FacadeController, "getData", null); FacadeController = __decorate([ decorators_1.Routable('/facade') ], FacadeController); exports.FacadeController = FacadeController; class FacadeUtil { static splitNextExeReq(fReqs, fRes) { return vendor_1._.groupBy(fReqs, (req) => { let groupKey = 'current'; vendor_1._.forEach(req.request.filters, (filter) => { if (filter.jPath && (!filter.value && (filter.value !== 0 || filter.value !== false))) { const jpath = filter.jPath; const val = fRes[jpath.key]; if (!val) { groupKey = 'next'; return; } const path = jpath.path; const v = mpath.get(path, val) || []; filter.value = v.length === 1 ? v[0] : v; } }); return groupKey; }); } static retrive(req, res, next, fReqCol, fRes) { return __awaiter(this, void 0, void 0, function* () { const collection = yield Promise.all(fReqCol.map((fReq) => __awaiter(this, void 0, void 0, function* () { return yield ((rReq, rRes, rNext, rFReq) => __awaiter(this, void 0, void 0, function* () { return FacadeUtil.invoke(rReq, rRes, rNext, rFReq); }))(req, res, next, fReq); }))); if (collection.length > 0) { vendor_1._.forEach(collection, (data) => vendor_1._.merge(fRes, data)); } return fRes; }); } static invoke(req, res, next, fReq) { return __awaiter(this, void 0, void 0, function* () { let api; let error; let data = { data: null }; try { const part = FacadeUtil.splitApiName(fReq.route); const reg = decorators_1.ServiceRegistry[part.path]; if (!reg) { throw new Error('Resource ' + part.path + ' not found'); } const apiKey = reg.NameList[part.methodName]; if (!apiKey) { throw new Error('Resource ' + part.methodName + ' not found in ' + part.path); } const service = reg.GetService(); req.body = fReq.request; const k = part.methodName.substr(1, part.methodName.length - 1); api = service[k]; } catch (err) { error = err; } data = error ? { Code: null, Message: error.message, Stack: error.stack } : yield api(req, res, next).catch((err) => error = err); return { [fReq.key]: data }; }); } static splitApiName(route) { const lastIndex = route.lastIndexOf('/'); const path = route.substr(0, lastIndex); const name = route.substr(lastIndex, route.length - lastIndex); return { path, methodName: name }; } } //# sourceMappingURL=facade.controller.js.map