@dazejs/framework
Version:
Daze.js - A powerful web framework for Node.js
58 lines (52 loc) • 1.73 kB
text/typescript
import { Application } from '../foundation/application';
import { UseMiddlewareOption } from '../decorators/use/interface';
import { Router } from '../http/router';
/**
* 控制器解析类
*/
export class ControllerService {
/**
* 应用实例
*/
public app: Application;
/**
* 控制器解析类构造函数
* @param app
*/
constructor(app: Application) {
this.app = app;
}
/**
* 注册一个控制器
*/
public register(controller: any) {
if (Reflect.getMetadata('type', controller) !== 'controller') return this;
this.resolve(controller);
return this;
}
/**
* 解析控制器
*/
public resolve(controller: any) {
const routes = Reflect.getMetadata('routes', controller) || {};
const prefixs = Reflect.getMetadata('prefixs', controller) || [''];
for (const prefix of prefixs) {
this.registerRoutes(controller, routes, prefix);
}
}
/**
* 注册控制器路由
*/
private registerRoutes(controller: any, routes: any, prefix = '') {
const router = this.app.get<Router>('router');
const controllerMiddlewareOptions: UseMiddlewareOption[] = Reflect.getMetadata('use-middlewares', controller) ?? [];
for (const key of Object.keys(routes)) {
const routeMiddlewares: { [key: string]: UseMiddlewareOption[] } = Reflect.getMetadata('use-middlewares', controller, key) ?? {};
for (const route of routes[key]) {
const { uri, method, option } = route;
const actionMiddlewareOptions = routeMiddlewares[key] ?? [];
router.register(`${prefix}${uri}`, [method], option, controller, key, [...controllerMiddlewareOptions, ...actionMiddlewareOptions]);
}
}
}
}