Chain of Draft Thinking

export class BaseError extends Error { public code: string; public status: number; public details?: any; constructor(message: string, code: string, status: number, details?: any) { super(message); this.name = this.constructor.name; this.code = code; this.status = status; this.details = details; Error.captureStackTrace(this, this.constructor); } } export class ValidationError extends BaseError { constructor(message: string, details?: any) { super(message, 'VALIDATION_ERROR', 400, details); } } export class EntityNotFoundError extends BaseError { constructor(message: string) { super(message, 'NOT_FOUND', 404); } } export class DatabaseError extends BaseError { constructor(message: string, details?: any) { super(message, 'DATABASE_ERROR', 500, details); } } export class UnauthorizedError extends BaseError { constructor(message: string) { super(message, 'UNAUTHORIZED', 401); } } export class ForbiddenError extends BaseError { constructor(message: string) { super(message, 'FORBIDDEN', 403); } }