import { BadRequestException, CallHandler, ExecutionContext, Logger, NestInterceptor } from "@nestjs/common"; import { catchError, Observable, throwError } from "rxjs"; import { ApiErrorResponse } from "src/libs/api/api-error.response"; import { ExceptionBase } from "src/libs/exceptions/exception.base"; import { RequestContextService } from "../context/AppRequestContext"; export class ExceptionInterceptor implements NestInterceptor { private readonly logger: Logger = new Logger(ExceptionInterceptor.name); intercept( _context: ExecutionContext, next: CallHandler ): Observable { return next.handle().pipe( catchError((err) => { if (err.status >= 400 && err.status < 500) { this.logger.debug( `[${RequestContextService.getRequestId()}] ${err.message}` ); const isClassValidatorError = Array.isArray(err?.response?.message) && typeof err?.response?.error === 'string' && err.status === 400; if(isClassValidatorError) { err = new BadRequestException( new ApiErrorResponse({ statusCode: err.status, message: 'Bad request error', error: err?.response?.error, subErrors: err?.response?.message, correlationId: RequestContextService.getRequestId() }), ); } } if(!err.correlationId) { err.correlationId = RequestContextService.getRequestId(); } if(err.response) { err.response.correlationId = err.correlationId; } return throwError(err) }) ) } }