51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
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<ExceptionBase> {
|
|
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)
|
|
})
|
|
)
|
|
}
|
|
} |