All files / src/common/errors app.exception.ts

0% Statements 0/12
0% Branches 0/9
0% Functions 0/5
0% Lines 0/12

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,
    });
  }
}