From b180968def043a0b3e40dab2e3ed72aa6108e0ae Mon Sep 17 00:00:00 2001 From: Francesco Spilla Date: Wed, 12 Feb 2025 17:06:39 +0100 Subject: [PATCH] chore(repo): made ZodSerializerDto optional --- .../app/modules/validation/zod.serializer.ts | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/apps/ebitemp-api/src/app/modules/validation/zod.serializer.ts b/apps/ebitemp-api/src/app/modules/validation/zod.serializer.ts index 5cd71aa..e42ce70 100644 --- a/apps/ebitemp-api/src/app/modules/validation/zod.serializer.ts +++ b/apps/ebitemp-api/src/app/modules/validation/zod.serializer.ts @@ -11,6 +11,7 @@ import { SetMetadata, StreamableFile, } from '@nestjs/common'; +import { chain } from 'lodash'; import { Observable, map } from 'rxjs'; import { ZodSchema } from 'zod'; @@ -34,7 +35,7 @@ export class ZodSerializerInterceptor implements NestInterceptor { } intercept(context: ExecutionContext, next: CallHandler): Observable { - const { dto: responseSchema } = this.getContextResponseSchema(context); + const responseSchema = this.getContextResponseSchema(context); return next.handle().pipe( map((res: object | object[]) => { @@ -51,10 +52,21 @@ export class ZodSerializerInterceptor implements NestInterceptor { ); } - protected getContextResponseSchema(context: ExecutionContext): { - dto: ZodDtoStatic | ZodSchema | undefined; - } { - return this.reflector.getAllAndMerge('zodSerializedDtoOptions', [context.getHandler(), context.getClass()]); + protected getContextResponseSchema(context: ExecutionContext): ZodDtoStatic | ZodSchema { + const zodSerializedDto = (() => { + const metadata = this.reflector.getAllAndMerge('zodSerializedDtoOptions', [context.getHandler(), context.getClass()]); + return metadata.dto; + })(); + if (zodSerializedDto) return zodSerializedDto; + + const swaggerApiResponseType = (() => { + const metadata = this.reflector.getAllAndMerge('swagger/apiResponse', [context.getHandler(), context.getClass()]); + const metadataForStatusCode = chain([metadata[HttpStatus.OK], metadata[HttpStatus.CREATED]]).filter(Boolean).first().value(); + return metadataForStatusCode.type; + })(); + if (swaggerApiResponseType) return swaggerApiResponseType; + + return undefined; } }