Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | import { HttpException, HttpStatus } from '@nestjs/common'; import { ErrorCode } from './error-codes.enum'; export interface AppExceptionOptions { code: ErrorCode; message: string; httpStatus?: HttpStatus; details?: any[]; fieldErrors?: Record<string, string>; } export class AppException extends HttpException { public readonly code: ErrorCode; public readonly details: any[]; public readonly fieldErrors: Record<string, string>; constructor(options: AppExceptionOptions) { const { code, message, httpStatus = HttpStatus.BAD_REQUEST, details = [], fieldErrors = {}, } = options; super( { success: false, error: { code, message, details, fieldErrors }, }, httpStatus, ); this.code = code; this.details = details; this.fieldErrors = fieldErrors; } static notFound(entity: string, code?: ErrorCode): AppException { return new AppException({ code: code ?? ErrorCode.NOT_FOUND, message: `${entity} not found`, httpStatus: HttpStatus.NOT_FOUND, }); } static forbidden(code?: ErrorCode): AppException { return new AppException({ code: code ?? ErrorCode.FORBIDDEN, message: 'You do not have permission to perform this action', httpStatus: HttpStatus.FORBIDDEN, }); } static conflict(message: string, code?: ErrorCode): AppException { return new AppException({ code: code ?? ErrorCode.CONFLICT, message, httpStatus: HttpStatus.CONFLICT, }); } static tenantCrossAccess(): AppException { return new AppException({ code: ErrorCode.TENANT_CROSS_ACCESS, message: 'Cross-tenant access is not permitted', httpStatus: HttpStatus.FORBIDDEN, }); } } |