zenith-backend / app /models /error_responses.py
teoat
deploy: sync from main Sun Jan 11 18:43:53 WIT 2026
4a2ab42
"""
Standardized Error Response Models for API consistency
"""
from datetime import datetime
from typing import Any, ClassVar
from pydantic import BaseModel
class ErrorDetail(BaseModel):
"""Detailed error information"""
field: str | None = None
message: str
code: str | None = None
details: dict[str, Any] | None = None
class APIErrorResponse(BaseModel):
"""Standardized API error response"""
success: bool = False
error: ErrorDetail
timestamp: datetime
request_id: str | None = None
path: str | None = None
class Config:
json_encoders: ClassVar = {datetime: lambda v: v.isoformat()}
class ValidationErrorResponse(BaseModel):
"""Response for validation errors with multiple field errors"""
success: bool = False
errors: list[ErrorDetail]
timestamp: datetime
request_id: str | None = None
path: str | None = None
class Config:
json_encoders: ClassVar = {datetime: lambda v: v.isoformat()}
class RateLimitErrorResponse(BaseModel):
"""Response for rate limiting errors"""
success: bool = False
error: ErrorDetail
retry_after: int # seconds
timestamp: datetime
request_id: str | None = None
path: str | None = None
class Config:
json_encoders: ClassVar = {datetime: lambda v: v.isoformat()}
# Common error codes
class ErrorCodes:
# Authentication & Authorization
UNAUTHORIZED = "UNAUTHORIZED"
FORBIDDEN = "FORBIDDEN"
TOKEN_EXPIRED = "TOKEN_EXPIRED"
INVALID_CREDENTIALS = "INVALID_CREDENTIALS"
# Validation
VALIDATION_ERROR = "VALIDATION_ERROR"
MISSING_REQUIRED_FIELD = "MISSING_REQUIRED_FIELD"
INVALID_FORMAT = "INVALID_FORMAT"
# Business Logic
RESOURCE_NOT_FOUND = "RESOURCE_NOT_FOUND"
RESOURCE_ALREADY_EXISTS = "RESOURCE_ALREADY_EXISTS"
OPERATION_NOT_ALLOWED = "OPERATION_NOT_ALLOWED"
INSUFFICIENT_PERMISSIONS = "INSUFFICIENT_PERMISSIONS"
# System
INTERNAL_SERVER_ERROR = "INTERNAL_SERVER_ERROR"
SERVICE_UNAVAILABLE = "SERVICE_UNAVAILABLE"
DATABASE_ERROR = "DATABASE_ERROR"
EXTERNAL_API_ERROR = "EXTERNAL_API_ERROR"
# Rate Limiting
RATE_LIMIT_EXCEEDED = "RATE_LIMIT_EXCEEDED"
# File Operations
FILE_TOO_LARGE = "FILE_TOO_LARGE"
INVALID_FILE_TYPE = "INVALID_FILE_TYPE"
UPLOAD_FAILED = "UPLOAD_FAILED"