from contextlib import asynccontextmanager from pathlib import Path from fastapi import FastAPI from fastapi.responses import FileResponse from fastapi.staticfiles import StaticFiles import app.models # noqa: F401 — registers models on Base.metadata before create_all from app.db import Base, engine from app.routes.auth import router as auth_router FRONTEND_DIST = Path(__file__).resolve().parent.parent.parent / "frontend" / "dist" @asynccontextmanager async def lifespan(app: FastAPI): async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) yield app = FastAPI(title="Quantumancy", lifespan=lifespan) app.include_router(auth_router) @app.get("/healthz") async def healthz(): return {"status": "ok"} app.mount("/assets", StaticFiles(directory=FRONTEND_DIST / "assets"), name="frontend-assets") @app.get("/{full_path:path}") async def serve_spa(full_path: str): return FileResponse(FRONTEND_DIST / "index.html")