From 28c631553f0638dd245be3054c637b2e80083f6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20L=C3=B3pez?= Date: Mon, 26 Jan 2026 14:07:25 +0100 Subject: [PATCH 1/2] enhance TransformEnumInterceptor to correctly retrieve parameter types and handle body/query transformations --- .../transform-enum.interceptor.ts | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/packages/apps/human-app/server/src/common/interceptors/transform-enum.interceptor.ts b/packages/apps/human-app/server/src/common/interceptors/transform-enum.interceptor.ts index 9dee23ae00..2448737c3e 100644 --- a/packages/apps/human-app/server/src/common/interceptors/transform-enum.interceptor.ts +++ b/packages/apps/human-app/server/src/common/interceptors/transform-enum.interceptor.ts @@ -8,6 +8,11 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { plainToInstance, ClassConstructor } from 'class-transformer'; import 'reflect-metadata'; +import { + PARAMTYPES_METADATA, + ROUTE_ARGS_METADATA, +} from '@nestjs/common/constants'; +import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum'; @Injectable() export class TransformEnumInterceptor implements NestInterceptor { @@ -44,19 +49,28 @@ export class TransformEnumInterceptor implements NestInterceptor { context: ExecutionContext, ): ClassConstructor | null { const handler = context.getHandler(); - const controller = context.getClass(); + const prototype = context.getClass().prototype; - // Get the parameter types of the route handler - const routeArgs = Reflect.getMetadata( - 'design:paramtypes', - controller.prototype, - handler.name, - ); + const paramTypes = + Reflect.getMetadata(PARAMTYPES_METADATA, prototype, handler.name) ?? []; + const routeArgs = + Reflect.getMetadata(ROUTE_ARGS_METADATA, prototype, handler.name) ?? {}; + + const routeArgEntries = Object.entries(routeArgs) as Array< + [string, { index?: number }] + >; - // Return the first parameter's constructor if the handler has a class (DTO) - return routeArgs && routeArgs.length > 0 - ? (routeArgs[0] as ClassConstructor) - : null; + for (const [key, metadata] of routeArgEntries) { + const [token] = key.split(':'); + if ( + Number(token) === RouteParamtypes.BODY || + Number(token) === RouteParamtypes.QUERY + ) { + const index = metadata.index ?? Number(key.split(':')[1]); + return paramTypes[index] ?? null; + } + } + return null; } private transformEnums( From e921d66f26d3625eb40a5aeb0e7cfb0d0ff4844d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20L=C3=B3pez?= Date: Mon, 26 Jan 2026 14:31:40 +0100 Subject: [PATCH 2/2] refactor(TransformEnumInterceptor): simplify target class retrieval by removing unnecessary route argument handling --- .../transform-enum.interceptor.ts | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/packages/apps/human-app/server/src/common/interceptors/transform-enum.interceptor.ts b/packages/apps/human-app/server/src/common/interceptors/transform-enum.interceptor.ts index 2448737c3e..5a17d6d675 100644 --- a/packages/apps/human-app/server/src/common/interceptors/transform-enum.interceptor.ts +++ b/packages/apps/human-app/server/src/common/interceptors/transform-enum.interceptor.ts @@ -8,11 +8,7 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { plainToInstance, ClassConstructor } from 'class-transformer'; import 'reflect-metadata'; -import { - PARAMTYPES_METADATA, - ROUTE_ARGS_METADATA, -} from '@nestjs/common/constants'; -import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum'; +import { PARAMTYPES_METADATA } from '@nestjs/common/constants'; @Injectable() export class TransformEnumInterceptor implements NestInterceptor { @@ -53,24 +49,11 @@ export class TransformEnumInterceptor implements NestInterceptor { const paramTypes = Reflect.getMetadata(PARAMTYPES_METADATA, prototype, handler.name) ?? []; - const routeArgs = - Reflect.getMetadata(ROUTE_ARGS_METADATA, prototype, handler.name) ?? {}; - - const routeArgEntries = Object.entries(routeArgs) as Array< - [string, { index?: number }] - >; - - for (const [key, metadata] of routeArgEntries) { - const [token] = key.split(':'); - if ( - Number(token) === RouteParamtypes.BODY || - Number(token) === RouteParamtypes.QUERY - ) { - const index = metadata.index ?? Number(key.split(':')[1]); - return paramTypes[index] ?? null; - } - } - return null; + + return ( + paramTypes.find((type: unknown) => this.isTransformableClass(type)) ?? + null + ); } private transformEnums( @@ -127,4 +110,18 @@ export class TransformEnumInterceptor implements NestInterceptor { } return bodyOrQuery; } + + private isTransformableClass(type: unknown): type is ClassConstructor { + if (typeof type !== 'function') { + return false; + } + + return ( + type !== String && + type !== Boolean && + type !== Number && + type !== Array && + type !== Object + ); + } }