From 7d515330acbef1a821ea3f4886aaf3adf9979e18 Mon Sep 17 00:00:00 2001 From: driescroons Date: Mon, 21 Mar 2022 14:22:13 +0100 Subject: [PATCH 1/2] feat: interceptor ordering --- src/RoutingControllers.ts | 1 + src/decorator/UseInterceptor.ts | 35 ++++++++++++++++++++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/RoutingControllers.ts b/src/RoutingControllers.ts index 7b4e3231..ccfe6a6b 100644 --- a/src/RoutingControllers.ts +++ b/src/RoutingControllers.ts @@ -172,6 +172,7 @@ export class RoutingControllers { * Creates interceptors from the given "use interceptors". */ protected prepareInterceptors(uses: InterceptorMetadata[]): Function[] { + uses.sort((interceptor1, interceptor2) => interceptor2.priority - interceptor1.priority); return uses.map(use => { if (use.interceptor.prototype && use.interceptor.prototype.intercept) { // if this is function instance of InterceptorInterface diff --git a/src/decorator/UseInterceptor.ts b/src/decorator/UseInterceptor.ts index 0e76c8fb..5c77a453 100644 --- a/src/decorator/UseInterceptor.ts +++ b/src/decorator/UseInterceptor.ts @@ -1,5 +1,16 @@ import { getMetadataArgsStorage } from '../index'; import { Action } from '../Action'; +import { UseInterceptorMetadataArgs } from '../metadata/args/UseInterceptorMetadataArgs'; + +/** + * Specifies a given interceptor middleware or interceptor function, to which UseInterceptorMetadataArgs can be applied, to be used for controller or controller action. + * Must be set to controller action or controller class. + */ +export function UseInterceptor( + optionsOrInterceptor: Partial | Function, + ...interceptors: Array +): Function; + /** * Specifies a given interceptor middleware or interceptor function to be used for controller or controller action. @@ -7,6 +18,15 @@ import { Action } from '../Action'; */ export function UseInterceptor(...interceptors: Array): Function; +/** + * Specifies a given interceptor middleware or interceptor function, to which UseInterceptorMetadataArgs can be applied, to be used for controller or controller action. + * Must be set to controller action or controller class. + */ +export function UseInterceptor( + optionsOrInterceptor: Partial | ((action: Action, result: any) => any), + ...interceptors: Array<(action: Action, result: any) => any> +): Function; + /** * Specifies a given interceptor middleware or interceptor function to be used for controller or controller action. * Must be set to controller action or controller class. @@ -14,16 +34,25 @@ export function UseInterceptor(...interceptors: Array): Function; export function UseInterceptor(...interceptors: Array<(action: Action, result: any) => any>): Function; /** - * Specifies a given interceptor middleware or interceptor function to be used for controller or controller action. + * Specifies a given interceptor middleware or interceptor function, to which UseInterceptorMetadataArgs can be applied, to be used for controller or controller action. * Must be set to controller action or controller class. */ -export function UseInterceptor(...interceptors: Array any)>): Function { +export function UseInterceptor( + optionsOrInterceptor: Partial | Function | ((action: Action, result: any) => any), + ...interceptors: Array any)> +): Function { + const optionsIsAnInterceptor = optionsOrInterceptor instanceof Function || Array.isArray(optionsOrInterceptor); + const options: Partial = optionsIsAnInterceptor + ? {} + : (optionsOrInterceptor as Partial); return function (objectOrFunction: Object | Function, methodName?: string) { - interceptors.forEach(interceptor => { + [...(optionsIsAnInterceptor ? [optionsOrInterceptor as Function] : []), ...interceptors].forEach(interceptor => { getMetadataArgsStorage().useInterceptors.push({ + ...options, interceptor: interceptor, target: methodName ? objectOrFunction.constructor : (objectOrFunction as Function), method: methodName, + priority: options.priority ?? 0, }); }); }; From d02d00ea9713de30ef34e6d30f29c7623e992061 Mon Sep 17 00:00:00 2001 From: driescroons Date: Mon, 21 Mar 2022 14:36:27 +0100 Subject: [PATCH 2/2] fix: prettier formatting --- src/decorator/UseInterceptor.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/decorator/UseInterceptor.ts b/src/decorator/UseInterceptor.ts index 5c77a453..1dfb27bd 100644 --- a/src/decorator/UseInterceptor.ts +++ b/src/decorator/UseInterceptor.ts @@ -3,7 +3,7 @@ import { Action } from '../Action'; import { UseInterceptorMetadataArgs } from '../metadata/args/UseInterceptorMetadataArgs'; /** - * Specifies a given interceptor middleware or interceptor function, to which UseInterceptorMetadataArgs can be applied, to be used for controller or controller action. + * Specifies a given interceptor middleware or interceptor function, to which UseInterceptorMetadataArgs can be applied, to be used for controller or controller action. * Must be set to controller action or controller class. */ export function UseInterceptor( @@ -11,7 +11,6 @@ export function UseInterceptor( ...interceptors: Array ): Function; - /** * Specifies a given interceptor middleware or interceptor function to be used for controller or controller action. * Must be set to controller action or controller class. @@ -19,7 +18,7 @@ export function UseInterceptor( export function UseInterceptor(...interceptors: Array): Function; /** - * Specifies a given interceptor middleware or interceptor function, to which UseInterceptorMetadataArgs can be applied, to be used for controller or controller action. + * Specifies a given interceptor middleware or interceptor function, to which UseInterceptorMetadataArgs can be applied, to be used for controller or controller action. * Must be set to controller action or controller class. */ export function UseInterceptor(