From 9f009309cbb8bc8868e93446500e46e12677f3e8 Mon Sep 17 00:00:00 2001 From: Gabriel Rosa Date: Thu, 7 Jul 2022 17:51:28 -0300 Subject: [PATCH 1/4] FIX: conditionally importing apm --- src/main.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.ts b/src/main.ts index 4d80a22..c0505ac 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,3 @@ -import 'elastic-apm-node/start'; import { NestFactory } from '@nestjs/core'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { writeFileSync } from 'fs'; @@ -10,11 +9,12 @@ import documentEmpty from '../swagger_empty.json'; import { AppModule } from './app.module'; async function bootstrap() { + if (process.env.ENV !== 'local') await import('elastic-apm-node/start'); + DadosferaLogger.setupLogger({ serviceName: 'maestro', serviceEnvironment: process.env.ENV, }); - const logger = new DadosferaLogger().logger; const orginalWinstonLog = logger.log.bind(logger); From d288a4f357bebfa49b0a1dc430f0cacb781ebbc2 Mon Sep 17 00:00:00 2001 From: Gabriel Rosa Date: Thu, 7 Jul 2022 18:18:53 -0300 Subject: [PATCH 2/4] FIX: conditionally importing apm --- src/apm.ts | 5 +++++ src/main.ts | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 src/apm.ts diff --git a/src/apm.ts b/src/apm.ts new file mode 100644 index 0000000..8c20720 --- /dev/null +++ b/src/apm.ts @@ -0,0 +1,5 @@ +export const startAPm = async () => { + if (process.env.ENV !== 'local') + return await import('elastic-apm-node/start'); +}; +startAPm(); diff --git a/src/main.ts b/src/main.ts index c0505ac..33c5e54 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,6 @@ +import './apm'; import { NestFactory } from '@nestjs/core'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; -import { writeFileSync } from 'fs'; import helmet from 'helmet'; import { DadosferaLogger } from 'dadosfera-logs'; @@ -9,8 +9,6 @@ import documentEmpty from '../swagger_empty.json'; import { AppModule } from './app.module'; async function bootstrap() { - if (process.env.ENV !== 'local') await import('elastic-apm-node/start'); - DadosferaLogger.setupLogger({ serviceName: 'maestro', serviceEnvironment: process.env.ENV, From f49c5ac1c1b171ad7bdd1320434cb75ec594e7f2 Mon Sep 17 00:00:00 2001 From: Gabriel Rosa Date: Thu, 7 Jul 2022 20:04:42 -0300 Subject: [PATCH 3/4] FIX: conditionally importing apm --- src/apm.ts | 5 ----- src/main.ts | 3 +-- 2 files changed, 1 insertion(+), 7 deletions(-) delete mode 100644 src/apm.ts diff --git a/src/apm.ts b/src/apm.ts deleted file mode 100644 index 8c20720..0000000 --- a/src/apm.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const startAPm = async () => { - if (process.env.ENV !== 'local') - return await import('elastic-apm-node/start'); -}; -startAPm(); diff --git a/src/main.ts b/src/main.ts index 33c5e54..788cf4c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import './apm'; +if (process.env.ENV !== 'local') require('elastic-apm-node/start'); import { NestFactory } from '@nestjs/core'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import helmet from 'helmet'; @@ -7,7 +7,6 @@ import { DadosferaLogger } from 'dadosfera-logs'; import documentEmpty from '../swagger_empty.json'; import { AppModule } from './app.module'; - async function bootstrap() { DadosferaLogger.setupLogger({ serviceName: 'maestro', From 88bc7fe625295f58fa0e6203d290b31d63ecb655 Mon Sep 17 00:00:00 2001 From: Arthur Simas Date: Thu, 7 Jul 2022 20:24:13 -0300 Subject: [PATCH 4/4] FIX: added exception filter to catch unhandled errors --- src/error/grpc-to-http-exception.filter.ts | 22 ++++++++++++++++++++++ src/modules/auth/auth.controller.ts | 3 +++ src/utils/ErrorBuilder.ts | 4 ++-- 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 src/error/grpc-to-http-exception.filter.ts diff --git a/src/error/grpc-to-http-exception.filter.ts b/src/error/grpc-to-http-exception.filter.ts new file mode 100644 index 0000000..3e187db --- /dev/null +++ b/src/error/grpc-to-http-exception.filter.ts @@ -0,0 +1,22 @@ +import { ExceptionFilter, Catch, ArgumentsHost } from '@nestjs/common'; +import { Response } from 'express'; + +import ErrorBuilder from '../utils/ErrorBuilder'; + +@Catch(Error) +export class GrpcToHttpExceptionFilter implements ExceptionFilter { + catch(exception: any, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + + // return this exception directly if is already of type ErrorBuilder, + // else transform it using the ErrorBuilder + const err = + exception.constructor.name === ErrorBuilder.name + ? exception + : new ErrorBuilder(exception.details); + + const { statusCode } = err.response; + return response.status(statusCode).json(err.response); + } +} diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 0560249..6db6a51 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -6,6 +6,7 @@ import { HttpCode, HttpStatus, Inject, + UseFilters, } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { @@ -22,8 +23,10 @@ import { import { AuthClientService } from './auth.service'; import { DadosferaLogger } from 'dadosfera-logs'; +import { GrpcToHttpExceptionFilter } from '../../error/grpc-to-http-exception.filter'; @ApiTags('Auth') +@UseFilters(new GrpcToHttpExceptionFilter()) @Controller('auth') export class AuthController { logger: any; diff --git a/src/utils/ErrorBuilder.ts b/src/utils/ErrorBuilder.ts index fd7095d..2f2cfd9 100644 --- a/src/utils/ErrorBuilder.ts +++ b/src/utils/ErrorBuilder.ts @@ -3,7 +3,7 @@ import { RpcException } from '@nestjs/microservices'; import ErrorCodes from './errorCodes'; -function enrichErrorCode(code: string) { +export function EnrichErrorCode(code: string) { switch (code) { case ErrorCodes.AUTH.WRONG_CREDENTIALS: return { @@ -138,7 +138,7 @@ export default class ErrorBuilder extends HttpException { logger.log(code); } - const { statusCode, message, error, code: rCode } = enrichErrorCode(code); + const { statusCode, message, error, code: rCode } = EnrichErrorCode(code); super({ statusCode, message, error, code: rCode }, statusCode); this.code = code; }