56 lines
1.5 KiB
Python
56 lines
1.5 KiB
Python
"""Common error response schema and exception handlers."""
|
|
|
|
from datetime import datetime
|
|
|
|
from fastapi import FastAPI, Request
|
|
from fastapi.responses import JSONResponse
|
|
from pydantic import BaseModel
|
|
from starlette.exceptions import HTTPException
|
|
|
|
from app.core.exceptions import AppException
|
|
|
|
|
|
class ErrorResponse(BaseModel):
|
|
"""Standard error response format."""
|
|
|
|
status_code: int
|
|
message: str
|
|
details: dict | None = None
|
|
timestamp: str
|
|
|
|
|
|
async def app_exception_handler(request: Request, exc: AppException) -> JSONResponse:
|
|
"""Handle application exceptions with standard response."""
|
|
return JSONResponse(
|
|
status_code=exc.status_code,
|
|
content={
|
|
"status_code": exc.status_code,
|
|
"message": exc.message,
|
|
"timestamp": datetime.utcnow().isoformat(),
|
|
},
|
|
)
|
|
|
|
|
|
async def http_exception_handler(request: Request, exc: HTTPException) -> JSONResponse:
|
|
"""Handle HTTP exceptions with standard response."""
|
|
return JSONResponse(
|
|
status_code=exc.status_code,
|
|
content={
|
|
"status_code": exc.status_code,
|
|
"message": str(exc.detail),
|
|
"timestamp": datetime.utcnow().isoformat(),
|
|
},
|
|
)
|
|
|
|
|
|
def register_exception_handlers(app: FastAPI):
|
|
"""Register all exception handlers with FastAPI app."""
|
|
app.add_exception_handler(
|
|
AppException,
|
|
app_exception_handler, # type: ignore[arg-type]
|
|
)
|
|
app.add_exception_handler(
|
|
HTTPException,
|
|
http_exception_handler, # type: ignore[arg-type]
|
|
)
|