File size: 2,250 Bytes
d623240
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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")