/**
* Error Utility Functions
*
* This file provides custom error classes and error handling utilities
* for consistent error management throughout the application.
*
* @author Sahabat Ibu Hamil Team
* @version 1.0.0
*/
/**
* Custom Application Error class
* Extends the built-in Error class with additional properties for HTTP status codes
*/
export class AppError extends Error {
public statusCode: number;
public isOperational: boolean;
constructor(message: string, statusCode: number = 500, isOperational: boolean = true) {
super(message);
this.statusCode = statusCode;
this.isOperational = isOperational;
// Maintains proper stack trace for where our error was thrown (only available on V8)
if (Error.captureStackTrace) {
Error.captureStackTrace(this, AppError);
}
this.name = this.constructor.name;
}
}
/**
* Validation Error class
* Specific error type for validation failures
*/
export class ValidationFailedError extends AppError {
public readonly details?: TDetails;
constructor(details?: TDetails, message = 'Validation failed') {
super(message, 422);
if (details !== undefined) {
this.details = details;
}
}
}
/**
* Not Found Error class
* Specific error type for resource not found scenarios
*/
export class NotFoundError extends AppError {
constructor(message: string = 'Resource not found') {
super(message, 404);
}
}
/**
* Unauthorized Error class
* Specific error type for authentication failures
*/
export class UnauthorizedError extends AppError {
constructor(message: string = 'Unauthorized access') {
super(message, 401);
}
}
/**
* Forbidden Error class
* Specific error type for authorization failures
*/
export class ForbiddenError extends AppError {
constructor(message: string = 'Forbidden access') {
super(message, 403);
}
}
/**
* Conflict Error class
* Specific error type for resource conflicts
*/
export class ConflictError extends AppError {
constructor(message: string = 'Resource conflict') {
super(message, 409);
}
}
/**
* Bad Request Error class
* Specific error type for bad request scenarios
*/
export class BadRequestError extends AppError {
constructor(message: string = 'Bad request') {
super(message, 400);
}
}
/**
* Internal Server Error class
* Specific error type for internal server errors
*/
export class InternalServerError extends AppError {
constructor(message: string = 'Internal server error') {
super(message, 500);
}
}