class AppError(Exception): def __init__( self, message: str, *, code: int, status_code: int, errors: list[dict] | None = None, ) -> None: super().__init__(message) self.message = message self.code = code self.status_code = status_code self.errors = errors or [] class AuthenticationError(AppError): def __init__(self, message: str = "unauthorized") -> None: super().__init__(message, code=10001, status_code=401) class AuthorizationError(AppError): def __init__(self, message: str = "forbidden") -> None: super().__init__(message, code=10002, status_code=403) class ValidationAppError(AppError): def __init__(self, message: str, errors: list[dict] | None = None) -> None: super().__init__(message, code=10003, status_code=422, errors=errors) class NotFoundAppError(AppError): def __init__(self, message: str, *, code: int = 40400) -> None: super().__init__(message, code=code, status_code=404) class ConflictAppError(AppError): def __init__(self, message: str, *, code: int = 40900) -> None: super().__init__(message, code=code, status_code=409) class BusinessAppError(AppError): def __init__(self, message: str, *, code: int, status_code: int = 400) -> None: super().__init__(message, code=code, status_code=status_code)