diff --git a/src/http/routing/Route.ts b/src/http/routing/Route.ts index ebf9fa8..7a633c5 100644 --- a/src/http/routing/Route.ts +++ b/src/http/routing/Route.ts @@ -6,9 +6,11 @@ import {ResponseFactory} from "../response/ResponseFactory"; import {Response} from "../lifecycle/Response"; import {Controllers} from "../../service/Controllers"; import {ErrorWithContext, Collection} from "@extollo/util"; +import {Container} from "@extollo/di"; import {Controller} from "../Controller"; import {Middlewares} from "../../service/Middlewares"; import {Middleware} from "./Middleware"; +import {Config} from "../../service/Config"; export type ResponseObject = ResponseFactory | string | number | void | any | Promise export type RouteHandler = ((request: Request, response: Response) => ResponseObject) | ((request: Request) => ResponseObject) | (() => ResponseObject) | string @@ -34,6 +36,9 @@ export class Route extends AppClass { this.registeredRoutes = [] this.registeredGroups = [] + const configService = Container.getContainer().make(Config) + const globalMiddleware = configService.get('server.middleware.global', {}) + const stack = [...this.compiledGroupStack].reverse() for ( const route of registeredRoutes ) { for ( const group of stack ) { @@ -47,6 +52,39 @@ export class Route extends AppClass { .each(def => route.appendMiddleware(def)) } + // Add the global pre- and post- middleware + if ( Array.isArray(globalMiddleware?.pre) ) { + const globalPre = [...globalMiddleware.pre].reverse() + for ( const item of globalPre ) { + if ( typeof item !== 'string' ) { + throw new ErrorWithContext(`Invalid global pre-middleware definition. Global middleware must be string-references.`, { + configKey: 'server.middleware.global.pre', + }) + } + + route.prependMiddleware({ + stage: 'pre', + handler: item, + }) + } + } + + if ( Array.isArray(globalMiddleware?.post) ) { + const globalPost = [...globalMiddleware.post] + for ( const item of globalPost ) { + if ( typeof item !== 'string' ) { + throw new ErrorWithContext(`Invalid global post-middleware definition. Global middleware must be string-references.`, { + configKey: 'server.middleware.global.post', + }) + } + + route.appendMiddleware({ + stage: 'post', + handler: item, + }) + } + } + route.resolvePreflight() // Try to resolve here to catch any errors at boot-time and pre-compile route.resolveHandler() route.resolvePostflight()