From bde1c0e39a5956444cca29cdf95ea20e3da38153 Mon Sep 17 00:00:00 2001 From: Adrian Kunz Date: Sun, 5 May 2024 13:24:50 +0200 Subject: [PATCH] fix: UniqueConflict handling --- src/util/unique-conflict.decorator.ts | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/util/unique-conflict.decorator.ts b/src/util/unique-conflict.decorator.ts index 275e1dc..fae4b27 100644 --- a/src/util/unique-conflict.decorator.ts +++ b/src/util/unique-conflict.decorator.ts @@ -1,7 +1,6 @@ -import {applyDecorators, ArgumentsHost, Catch, ConflictException, UseFilters} from '@nestjs/common'; +import {applyDecorators, ArgumentsHost, Catch, ExceptionFilter, HttpStatus, UseFilters} from '@nestjs/common'; import {ApiConflictResponse} from '@nestjs/swagger'; import {mongo} from 'mongoose'; -import {BaseExceptionFilter} from '@nestjs/core'; // TODO move everything to @mean-stream/nestx @@ -9,23 +8,31 @@ import {BaseExceptionFilter} from '@nestjs/core'; * Converts a MongoServerError with code 11000 into a ConflictException with a configurable message. */ @Catch(mongo.MongoServerError) -class ConflictExceptionFilter extends BaseExceptionFilter { +class ConflictExceptionFilter implements ExceptionFilter { constructor( private description: Partial>, ) { - super(); } catch(exception: mongo.MongoServerError, host: ArgumentsHost): any { + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); if (exception.code !== 11000) { - return super.catch(exception, host); + response.status(500).json({ + statusCode: 500, + message: exception.message, + }); + return; } const keyPattern = exception.keyPattern; // e.g. { username: 1 } const values = exception.keyValue; // e.g. { username: 'test' } const indexKey = Object.keys(keyPattern).join('_'); - const http = new ConflictException(this.description[indexKey] ?? `Unique constraint violation on '${indexKey}' with value ${JSON.stringify(values)}.`); - return super.catch(http, host); + const message = this.description[indexKey] ?? `Unique constraint violation on '${indexKey}' with value ${JSON.stringify(values)}.`; + response.status(HttpStatus.CONFLICT).json({ + statusCode: HttpStatus.CONFLICT, + message, + }); } }