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