diff --git a/src/auth.ts b/src/auth.ts index 307f279..f5b45d8 100644 --- a/src/auth.ts +++ b/src/auth.ts @@ -18,7 +18,11 @@ class AuthInfo { function authenticate(roles: RoleName[] = []) { return function (route: any, method: string) { const routeClass = (<typeof Route> route.constructor); - routeClass.preRequestHandlers[method] = async (req: Request): Promise<AuthInfo> => { + if (!routeClass.preRequestHandlers[routeClass.name]) { + routeClass.preRequestHandlers[routeClass.name] = {} + } + + routeClass.preRequestHandlers[routeClass.name][method] = async (req: Request): Promise<AuthInfo> => { let user: Optional<User>; let session: Optional<UserSession>; diff --git a/src/routes/Route.ts b/src/routes/Route.ts index 81da82d..d109fb7 100644 --- a/src/routes/Route.ts +++ b/src/routes/Route.ts @@ -14,8 +14,8 @@ import { logRequest } from '../helpers/logging'; abstract class Route { protected readonly path: string; - // Method -> Handler mapping - public static preRequestHandlers: Record<string, RequestHandler> = {}; + // Route -> Method -> Handler mapping + public static preRequestHandlers: Record<string, Record<string, RequestHandler>> = {}; constructor(path: string) { this.path = path; @@ -76,9 +76,10 @@ abstract class Route { logRequest(req); try { + const routeClass = <typeof Route> this.constructor; // @ts-expect-error const handler = (this[handlerName]) as ((req: Request, res: Response, auth: AuthInfo) => Promise<void>); - const preRequestHandler = (<typeof Route> this.constructor).preRequestHandlers[handlerName]; + const preRequestHandler = routeClass.preRequestHandlers[routeClass.name]?.[handlerName]; let authInfo: Optional<AuthInfo> if (preRequestHandler) {