From a70d6bdd9e0481dc05c54b4305de07b4c8a81b8a Mon Sep 17 00:00:00 2001 From: Ryan Cartwright Date: Wed, 15 Feb 2023 13:48:11 +1100 Subject: [PATCH 1/2] apply api middleware to routes --- src/resources/api.ts | 75 +++++++++++++++++++++++++++++++++----------- 1 file changed, 56 insertions(+), 19 deletions(-) diff --git a/src/resources/api.ts b/src/resources/api.ts index 02ce3a6e..170aaf7f 100644 --- a/src/resources/api.ts +++ b/src/resources/api.ts @@ -284,7 +284,20 @@ class Api extends Base { route(match: string, options?: RouteOpts): Route { // ensure path seperator is always foward slash (for windows) const apiRoute = path.join(this.path, match).split(path.sep).join('/'); - const r = new Route(this, apiRoute, options); + + let routeMiddleware = []; + if (options) { + routeMiddleware = Array.isArray(options.middleware) + ? options.middleware + : options.middleware + ? [options.middleware] + : []; + } + + const r = new Route(this, apiRoute, { + ...options, + middleware: [...this.middleware, ...routeMiddleware], + }); this.routes.push(r); return r; } @@ -308,9 +321,13 @@ class Api extends Base { middleware: HttpMiddleware | HttpMiddleware[], opts?: MethodOptions ): Promise { - const r = this.route(match); - const m = Array.isArray(middleware) ? middleware : [middleware]; - return r.get(opts, ...m); + const r = this.route(match, { + middleware: this.middleware ?? [], + }); + const routeMiddleware = Array.isArray(middleware) + ? middleware + : [middleware]; + return r.get(opts, ...routeMiddleware); } /** @@ -324,9 +341,13 @@ class Api extends Base { middleware: HttpMiddleware | HttpMiddleware[], opts?: MethodOptions ): Promise { - const r = this.route(match); - const m = Array.isArray(middleware) ? middleware : [middleware]; - return r.post(opts, ...m); + const r = this.route(match, { + middleware: this.middleware ?? [], + }); + const routeMiddleware = Array.isArray(middleware) + ? middleware + : [middleware]; + return r.post(opts, ...(routeMiddleware ?? [])); } /** @@ -340,9 +361,13 @@ class Api extends Base { middleware: HttpMiddleware | HttpMiddleware[], opts?: MethodOptions ): Promise { - const r = this.route(match); - const m = Array.isArray(middleware) ? middleware : [middleware]; - return r.put(opts, ...m); + const r = this.route(match, { + middleware: this.middleware ?? [], + }); + const routeMiddleware = Array.isArray(middleware) + ? middleware + : [middleware]; + return r.put(opts, ...(routeMiddleware ?? [])); } /** @@ -356,9 +381,13 @@ class Api extends Base { middleware: HttpMiddleware | HttpMiddleware[], opts?: MethodOptions ): Promise { - const r = this.route(match); - const m = Array.isArray(middleware) ? middleware : [middleware]; - return r.patch(opts, ...m); + const r = this.route(match, { + middleware: this.middleware ?? [], + }); + const routeMiddleware = Array.isArray(middleware) + ? middleware + : [middleware]; + return r.patch(opts, ...(routeMiddleware ?? [])); } /** @@ -372,9 +401,13 @@ class Api extends Base { middleware: HttpMiddleware | HttpMiddleware[], opts?: MethodOptions ): Promise { - const r = this.route(match); - const m = Array.isArray(middleware) ? middleware : [middleware]; - return r.delete(opts, ...m); + const r = this.route(match, { + middleware: this.middleware ?? [], + }); + const routeMiddleware = Array.isArray(middleware) + ? middleware + : [middleware]; + return r.delete(opts, ...(routeMiddleware ?? [])); } /** @@ -388,9 +421,13 @@ class Api extends Base { middleware: HttpMiddleware | HttpMiddleware[], opts?: MethodOptions ): Promise { - const r = this.route(match); - const m = Array.isArray(middleware) ? middleware : [middleware]; - return r.options(opts, ...m); + const r = this.route(match, { + middleware: this.middleware ?? [], + }); + const routeMiddleware = Array.isArray(middleware) + ? middleware + : [middleware]; + return r.options(opts, ...(routeMiddleware ?? [])); } /** From 829564b8770ea3079eeb54a6d5dc988c207935bd Mon Sep 17 00:00:00 2001 From: Ryan Cartwright Date: Wed, 15 Feb 2023 13:55:22 +1100 Subject: [PATCH 2/2] add check for undefined middleware --- src/resources/api.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/resources/api.ts b/src/resources/api.ts index 170aaf7f..5629f918 100644 --- a/src/resources/api.ts +++ b/src/resources/api.ts @@ -97,7 +97,11 @@ class Route { this.api = api; this.path = path; const { middleware = [] } = opts; - this.middleware = Array.isArray(middleware) ? middleware : [middleware]; + this.middleware = Array.isArray(middleware) + ? middleware + : middleware + ? [middleware] + : []; } async method( @@ -258,7 +262,11 @@ class Api extends Base { } = options; // prepend / to path if its not there this.path = path.replace(/^\/?/, '/'); - this.middleware = Array.isArray(middleware) ? middleware : [middleware]; + this.middleware = Array.isArray(middleware) + ? middleware + : middleware + ? [middleware] + : []; this.securityDefinitions = securityDefinitions; this.security = security; this.routes = [];