import uvicorn from fastapi import FastAPI, Request from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import JSONResponse from fastapi.exceptions import RequestValidationError from sqlalchemy.exc import SQLAlchemyError from app.api.v1.api import api_router from app.core.config import settings from app.utils.errors import BlogAPIError app = FastAPI( title=settings.PROJECT_NAME, description="Blogging Platform API", version="0.1.0", openapi_url="/openapi.json", docs_url="/docs", redoc_url="/redoc", ) # Exception handlers @app.exception_handler(BlogAPIError) async def blog_api_exception_handler(request: Request, exc: BlogAPIError): return JSONResponse( status_code=exc.status_code, content={"detail": exc.detail}, ) @app.exception_handler(RequestValidationError) async def validation_exception_handler(request: Request, exc: RequestValidationError): return JSONResponse( status_code=422, content={"detail": "Validation error", "errors": exc.errors()}, ) @app.exception_handler(SQLAlchemyError) async def sqlalchemy_exception_handler(request: Request, exc: SQLAlchemyError): return JSONResponse( status_code=500, content={"detail": "Database error", "error": str(exc)}, ) # Set up CORS app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Include routers app.include_router(api_router, prefix=settings.API_V1_STR) # Health check endpoint @app.get("/health", tags=["health"]) async def health_check(): return {"status": "healthy"} if __name__ == "__main__": uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)