oraculo_api / app /core /exceptions.py
Diiegoal's picture
Actualizo la app
d623240
Raw
History Blame Contribute Delete
2.25 kB
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any
@dataclass(slots=True)
class AppError(Exception):
message: str
status_code: int = 400
code: str = "app_error"
detail: dict[str, Any] = field(default_factory=dict)
class BadRequestError(AppError):
def __init__(self, message: str, detail: dict[str, Any] | None = None) -> None:
super().__init__(message=message, status_code=400, code="bad_request", detail=detail or {})
class AuthenticationError(AppError):
def __init__(self, message: str = "Authentication failed.") -> None:
super().__init__(message=message, status_code=401, code="authentication_error")
class AuthorizationError(AppError):
def __init__(self, message: str = "You are not allowed to access this resource.") -> None:
super().__init__(message=message, status_code=403, code="authorization_error")
class ResourceNotFoundError(AppError):
def __init__(self, resource_name: str, resource_id: str) -> None:
super().__init__(
message=f"{resource_name} '{resource_id}' was not found.",
status_code=404,
code="resource_not_found",
detail={"resource_name": resource_name, "resource_id": resource_id},
)
class ConflictError(AppError):
def __init__(self, message: str, detail: dict[str, Any] | None = None) -> None:
super().__init__(message=message, status_code=409, code="conflict", detail=detail or {})
class RateLimitExceededError(AppError):
def __init__(self, retry_after_seconds: int) -> None:
super().__init__(
message="Rate limit exceeded. Please retry later.",
status_code=429,
code="rate_limit_exceeded",
detail={"retry_after_seconds": retry_after_seconds},
)
class ServiceUnavailableError(AppError):
def __init__(self, message: str = "Service temporarily unavailable.") -> None:
super().__init__(message=message, status_code=503, code="service_unavailable")
class ModelInferenceError(AppError):
def __init__(self, message: str = "Model inference failed.") -> None:
super().__init__(message=message, status_code=500, code="model_inference_error")