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] )