ts-api-core
Version:
Nodejs api framework core
184 lines • 8.57 kB
JavaScript
"use strict";
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 });
exports.RoutesRegister = void 0;
const api_request_context_1 = require("../context/api.request.context");
const base_route_execute_controller_1 = require("../controller/base.route.execute.controller");
const base_route_graph_controller_1 = require("../controller/base.route.graph.controller");
const base_route_raw_controller_1 = require("../controller/base.route.raw.controller");
const reqest_data_1 = require("./reqest.data");
const package_loader_1 = require("../utils/package.loader");
const ioc_decorator_1 = require("../mvc/ioc.decorator");
const base_route_sql_controller_1 = require("../controller/base.route.sql.controller");
/**
* 自动路由注册服务
*/
class RoutesRegister {
/**
* @param routes 需要自动注册路由信息数组
*/
constructor(app, routeClass, routes = [], wrappers, logger) {
this.app = app;
this.routeClass = routeClass;
this.routes = routes;
this.wrappers = wrappers;
this.logger = logger;
this.groupMap = new Map();
this.groupRoutes = new Array();
this.basePaths = new Map();
}
get router() {
if (!RoutesRegister._router) {
const Router = package_loader_1.PackageLoader.load('express');
RoutesRegister._router = Router();
}
return RoutesRegister._router;
}
getRoutes() {
return this.routes;
}
getGroupRoutes() {
return this.groupRoutes;
}
getBaseUrl(route) {
const value = this.basePaths.get(route);
return value ? value[0] : '';
}
/** 获取自定义的 wrapper */
getCustomWrapper(name) {
var _a;
return (_a = this.wrappers) === null || _a === void 0 ? void 0 : _a.get(name);
}
getController(reqType) {
switch (reqType) {
case reqest_data_1.RequestType.Raw:
return base_route_raw_controller_1.BaseRouteRawController;
case reqest_data_1.RequestType.ExecuteWrapper:
return base_route_execute_controller_1.BaseRouteExecuteController;
case reqest_data_1.RequestType.GraphQL:
return base_route_graph_controller_1.BaseRouteGraphController;
case reqest_data_1.RequestType.SQL:
return base_route_sql_controller_1.BaseRouteSqlController;
default:
const [item, _] = ioc_decorator_1.IocContainer.getDefinition(reqType);
return item && ioc_decorator_1.IocContainer.isClass(item.classType) ? item.classType : undefined;
}
}
/** 注册路由 */
register() {
const bodyParser = package_loader_1.PackageLoader.load('body-parser');
if (this.routeClass.length > 0) {
this.routeClass.forEach((item) => {
var _a, _b;
const config = new item();
const data = config.data();
if (data) {
let index = this.groupMap.get(config.name);
if (index === undefined) {
index = this.groupRoutes.length;
this.groupMap.set(config.name, index);
this.groupRoutes.push({ name: config.name, index: (_a = config.index) !== null && _a !== void 0 ? _a : 0, routes: [] });
}
let group = this.groupRoutes[index];
if (Array.isArray(data)) {
data.forEach((routeItem) => {
var _a;
this.routes.push(routeItem);
const cfg = ioc_decorator_1.IocContainer.getRouteConfig(item);
this.basePaths.set(routeItem, [(_a = cfg === null || cfg === void 0 ? void 0 : cfg.basePath) !== null && _a !== void 0 ? _a : '', cfg === null || cfg === void 0 ? void 0 : cfg.logPackage]);
group.routes.push(routeItem);
});
}
else {
this.routes.push(data);
const cfg = ioc_decorator_1.IocContainer.getRouteConfig(item);
this.basePaths.set(data, [(_b = cfg === null || cfg === void 0 ? void 0 : cfg.basePath) !== null && _b !== void 0 ? _b : '', cfg === null || cfg === void 0 ? void 0 : cfg.logPackage]);
group.routes.push(data);
}
}
});
}
if (this.routes.length === 0) {
return;
}
this.routes.forEach(route => {
var _a;
const value = (_a = this.basePaths.get(route)) !== null && _a !== void 0 ? _a : [undefined, undefined];
this.registerRoute(route, value[0], value[1]);
});
const params = ["/", bodyParser.json()];
params.push(this.router);
// eslint-disable-next-line @typescript-eslint/ban-types
this.app.use.apply(this.app, params);
}
/** 注册 */
registerRoute(route, basePath, logPackage) {
if (!(route === null || route === void 0 ? void 0 : route.path)) {
return;
}
if (route.logPackage === undefined) {
route.logPackage = logPackage;
}
const fn = (req, res, next) => __awaiter(this, void 0, void 0, function* () {
var _a;
const instanceClass = this.getController(route.type);
if (!instanceClass) {
next(undefined);
return;
}
const context = new api_request_context_1.APIRequestContext(this.logger, route.logPackage);
context.req = req;
context.resp = res;
context.route = route;
const args = (_a = ioc_decorator_1.IocContainer.getClassConstructorArgs(context, instanceClass)) !== null && _a !== void 0 ? _a : [context];
const instance = new instanceClass(...args);
try {
ioc_decorator_1.IocContainer.resolveInject(context, instance, instanceClass);
const result = instance.executeRequest(context);
if (result instanceof Promise) {
result
.then((value) => {
!res.headersSent && res.status(200).send(value);
context.release(value);
})
.catch((err) => {
context.error = err;
context.release();
next(err);
});
}
else if (result !== undefined) {
!res.headersSent && res.status(200).send(result);
context.release(result);
}
}
catch (e1) {
context.error = e1;
context.release();
next(e1);
return;
}
});
const methods = Array.isArray(route.methed) ? route.methed : [route.methed];
const path = (basePath !== null && basePath !== void 0 ? basePath : '') + route.path;
// eslint-disable-next-line no-console
console.log("Register Router " + methods.join(",") + ": " + path);
// register sub route
const params = [path];
params.push(fn);
methods.forEach((methedItems) => {
// eslint-disable-next-line @typescript-eslint/ban-types
this.router[methedItems].apply(this.router, params);
});
}
}
exports.RoutesRegister = RoutesRegister;
//# sourceMappingURL=routes.register.js.map