diff --git a/gnexus_creds/main.py b/gnexus_creds/main.py index 99d9f8f..08e6f77 100644 --- a/gnexus_creds/main.py +++ b/gnexus_creds/main.py @@ -1,7 +1,11 @@ """FastAPI application entrypoint.""" +from pathlib import Path + from fastapi import FastAPI from fastapi.exceptions import RequestValidationError +from fastapi.responses import FileResponse +from fastapi.staticfiles import StaticFiles from sqlalchemy import text from gnexus_creds.api import admin_router @@ -14,6 +18,9 @@ from gnexus_creds.oauth import router as auth_router from gnexus_creds.oauth import webhook_router +PROJECT_ROOT = Path(__file__).resolve().parent.parent +FRONTEND_DIST = PROJECT_ROOT / "frontend" / "dist" + def create_app() -> FastAPI: configure_logging() @@ -37,6 +44,21 @@ db.execute(text("select 1")) return {"status": "ok"} + if FRONTEND_DIST.exists(): + assets_dir = FRONTEND_DIST / "assets" + if assets_dir.exists(): + app.mount("/assets", StaticFiles(directory=assets_dir), name="assets") + + @app.get("/", include_in_schema=False) + async def index() -> FileResponse: + return FileResponse(FRONTEND_DIST / "index.html") + + @app.get("/{path:path}", include_in_schema=False) + async def spa_fallback(path: str) -> FileResponse: + if path.startswith(("api/", "auth/", "mcp/", "webhooks/")): + raise AppError("not_found", "Not found.", status_code=404) + return FileResponse(FRONTEND_DIST / "index.html") + return app