From b19cdf2b47bd64d8fa191153b27f7916b6dfbc5d Mon Sep 17 00:00:00 2001 From: PTah Date: Wed, 27 May 2026 11:01:47 +1000 Subject: [PATCH] =?UTF-8?q?fix:=20SPA=20fallback=20=D0=B4=D0=BB=D1=8F=20/e?= =?UTF-8?q?vents=20=D0=BF=D1=80=D0=B8=20F5=20(index.html)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/main.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/backend/app/main.py b/backend/app/main.py index 1bbd1f5..6cb4c6f 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1,8 +1,9 @@ from contextlib import asynccontextmanager from pathlib import Path -from fastapi import FastAPI +from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import FileResponse from fastapi.staticfiles import StaticFiles from sqlalchemy import select @@ -67,7 +68,25 @@ def create_app() -> FastAPI: frontend_dist = ROOT / "frontend" / "dist" if frontend_dist.is_dir(): - app.mount("/", StaticFiles(directory=str(frontend_dist), html=True), name="ui") + assets_dir = frontend_dist / "assets" + if assets_dir.is_dir(): + app.mount( + "/assets", + StaticFiles(directory=str(assets_dir)), + name="ui-assets", + ) + + @app.get("/{spa_path:path}") + def spa_fallback(spa_path: str) -> FileResponse: + if spa_path.startswith("api/"): + raise HTTPException(status_code=404, detail="Not Found") + candidate = frontend_dist / spa_path + if spa_path and candidate.is_file(): + return FileResponse(candidate) + index = frontend_dist / "index.html" + if not index.is_file(): + raise HTTPException(status_code=404, detail="UI not built") + return FileResponse(index) return app