mission.api
Version:
mission api
124 lines • 6.09 kB
JavaScript
;
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