from contextlib import asynccontextmanager from pathlib import Path from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import FileResponse from fastapi.staticfiles import StaticFiles from src.api.router import api_router from src.api.schemas.common import HealthResponse from src.config import settings from src.db.session import init_db @asynccontextmanager async def lifespan(app: FastAPI): # Startup: ensure directories exist and init DB settings.raw_dir.mkdir(parents=True, exist_ok=True) settings.processed_dir.mkdir(parents=True, exist_ok=True) settings.chroma_db_path.mkdir(parents=True, exist_ok=True) settings.sqlite_db_path.parent.mkdir(parents=True, exist_ok=True) await init_db() yield app = FastAPI( title="Natural Hygiene RAG API", description="Retrieval-Augmented Generation system for Natural Hygiene literature", version="0.1.0", lifespan=lifespan, ) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], ) app.include_router(api_router) # Serve static dashboard _static_dir = Path(__file__).parent / "static" @app.get("/", include_in_schema=False) async def dashboard(): return FileResponse(_static_dir / "index.html") app.mount("/static", StaticFiles(directory=str(_static_dir)), name="static") @app.get("/health", response_model=HealthResponse, tags=["Health"]) async def health_check(): return HealthResponse()