From bf065873a07363858040416e9fc6966f7eba8d12 Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Sun, 19 Jul 2020 10:50:04 +0200 Subject: [PATCH 1/2] Update users.service.ts --- src/users/users.service.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 1e4f13a8..0373cb30 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -32,11 +32,8 @@ export class UsersService { return new UserLoginResponseDto(userData, null); } catch (err) { - if (err.original.constraint === 'user_email_key') { - throw new HttpException(`User with email '${err.errors[0].value}' already exists`, HttpStatus.CONFLICT); - } - throw new HttpException(err, HttpStatus.INTERNAL_SERVER_ERROR); + throw new HttpException(err.message, HttpStatus.INTERNAL_SERVER_ERROR); } } From 1b4159a475a0f9209f08d9fee2779d6013da98ea Mon Sep 17 00:00:00 2001 From: Pavel Strunkin Date: Sun, 19 Jul 2020 13:55:46 +0200 Subject: [PATCH 2/2] HttpPrismaExceptionFilter added --- src/app.module.ts | 10 +++++++++- src/http-prisma-exception.filter.ts | 20 ++++++++++++++++++++ src/users/users.service.ts | 13 ++++--------- 3 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 src/http-prisma-exception.filter.ts diff --git a/src/app.module.ts b/src/app.module.ts index 1c5a00a6..f59b7c7c 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -7,6 +7,8 @@ import { TestRunsModule } from './test-runs/test-runs.module'; import { TestVariationsModule } from './test-variations/test-variations.module'; import { PrismaService } from './prisma/prisma.service'; import { ConfigModule } from '@nestjs/config'; +import { APP_FILTER } from '@nestjs/core'; +import { HttpPrismaExceptionFilter } from './http-prisma-exception.filter'; @Module({ imports: [ @@ -18,6 +20,12 @@ import { ConfigModule } from '@nestjs/config'; TestRunsModule, TestVariationsModule, ], - providers: [PrismaService], + providers: [ + PrismaService, + { + provide: APP_FILTER, + useClass: HttpPrismaExceptionFilter, + }, + ], }) export class AppModule {} diff --git a/src/http-prisma-exception.filter.ts b/src/http-prisma-exception.filter.ts new file mode 100644 index 00000000..ac2b0f44 --- /dev/null +++ b/src/http-prisma-exception.filter.ts @@ -0,0 +1,20 @@ +import { ExceptionFilter, Catch, ArgumentsHost, HttpException, HttpStatus } from '@nestjs/common'; +import { Request, Response } from 'express'; +import { PrismaClientKnownRequestError } from '@prisma/client'; + +@Catch(PrismaClientKnownRequestError) +export class HttpPrismaExceptionFilter implements ExceptionFilter { + catch(exception: PrismaClientKnownRequestError, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + const request = ctx.getRequest(); + + response.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ + stack: exception.stack, + message: exception.message, + code: exception.code, + timestamp: new Date().toISOString(), + path: request.url, + }); + } +} diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 0373cb30..4256d0af 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -25,16 +25,11 @@ export class UsersService { password: await this.authService.encryptPassword(createUserDto.password), }; - try { - const userData = await this.prismaService.user.create({ - data: user, - }); - - return new UserLoginResponseDto(userData, null); - } catch (err) { + const userData = await this.prismaService.user.create({ + data: user, + }); - throw new HttpException(err.message, HttpStatus.INTERNAL_SERVER_ERROR); - } + return new UserLoginResponseDto(userData, null); } async findOne(id: string): Promise {