49 lines
1.3 KiB
Python
49 lines
1.3 KiB
Python
from datetime import datetime, timezone
|
|
|
|
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):
|
|
status_code: int
|
|
message: str
|
|
details: dict[str, str] | None = None
|
|
timestamp: str
|
|
|
|
|
|
async def app_exception_handler(request: Request, exc: AppException) -> JSONResponse:
|
|
return JSONResponse(
|
|
status_code=exc.status_code,
|
|
content={
|
|
"status_code": exc.status_code,
|
|
"message": exc.message,
|
|
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
},
|
|
)
|
|
|
|
|
|
async def http_exception_handler(request: Request, exc: HTTPException) -> JSONResponse:
|
|
return JSONResponse(
|
|
status_code=exc.status_code,
|
|
content={
|
|
"status_code": exc.status_code,
|
|
"message": str(exc.detail),
|
|
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
},
|
|
)
|
|
|
|
|
|
def register_exception_handlers(app: FastAPI) -> None:
|
|
app.add_exception_handler(
|
|
AppException,
|
|
app_exception_handler, # type: ignore[arg-type]
|
|
)
|
|
app.add_exception_handler(
|
|
HTTPException,
|
|
http_exception_handler, # type: ignore[arg-type]
|
|
)
|