UNPKG

ts-api-core

Version:

Nodejs api framework core

184 lines 8.57 kB
"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