import os from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.gzip import GZipMiddleware from app.core.config import settings from app.routers import auth from app import models # Import all models so SQLModel metadata registers them from fastapi_cache import FastAPICache from fastapi_cache.backends.redis import RedisBackend from redis import asyncio as aioredis from slowapi import _rate_limit_exceeded_handler from slowapi.errors import RateLimitExceeded from slowapi.middleware import SlowAPIMiddleware from app.core.limiter import limiter @asynccontextmanager async def lifespan(app: FastAPI): """Lifespan events for the FastAPI application.""" # Conecta no Redis via variável de ambiente (Upstash em produção, localhost em dev) redis_url = os.environ.get("REDIS_URL", "redis://localhost:6379") redis = aioredis.from_url(redis_url, encoding="utf-8", decode_responses=True) FastAPICache.init(RedisBackend(redis), prefix="docboard:", expire=300) yield app = FastAPI( title=settings.APP_NAME, description="Backend API for the DocBoard application.", version="0.1.0", lifespan=lifespan, docs_url="/docs" if settings.DEBUG else None, redoc_url="/redoc" if settings.DEBUG else None, openapi_url="/openapi.json" if settings.DEBUG else None, ) app.state.limiter = limiter app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) app.add_middleware(SlowAPIMiddleware) # ─── CORS ───────────────────────────────────────────────────────────────────── app.add_middleware( CORSMiddleware, allow_origins=[ os.environ.get("ALLOWED_ORIGINS", "http://localhost:5173"), ], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.add_middleware(GZipMiddleware, minimum_size=1000) # ─── Routers ────────────────────────────────────────────────────────────────── from app.routers import auth, procedures, resources, dashboard, safety, teams, growth, users app.include_router(auth.router) app.include_router(procedures.router) app.include_router(resources.router) app.include_router(dashboard.router) app.include_router(safety.router) app.include_router(teams.router) app.include_router(growth.router) app.include_router(users.router) @app.get("/", tags=["Health"]) def health_check(): return {"status": "ok", "app": settings.APP_NAME}