diff --git a/app/main.py b/app/main.py index aedd157..b86b08c 100644 --- a/app/main.py +++ b/app/main.py @@ -5,6 +5,7 @@ from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import RedirectResponse from fastapi.staticfiles import StaticFiles from starlette.exceptions import HTTPException as StarletteHTTPException from starlette.middleware.base import BaseHTTPMiddleware @@ -139,6 +140,14 @@ app.include_router(api_router) app.include_router(openapi_router) app.include_router(mcp_router) + +@app.get("/", include_in_schema=False) +async def root_redirect() -> RedirectResponse: + """Send the public domain root to the bundled admin application.""" + + return RedirectResponse(url="/admin/", status_code=307) + + # Serve built admin-web SPA (when available) try: app.mount("/admin", SPAStaticFiles(directory="app/static/admin", html=True), name="admin-web") diff --git a/tests/test_management_surface.py b/tests/test_management_surface.py index effcd9f..0ea21fa 100644 --- a/tests/test_management_surface.py +++ b/tests/test_management_surface.py @@ -1,9 +1,17 @@ import unittest +from fastapi.testclient import TestClient + from app.main import app class ManagementSurfaceTests(unittest.TestCase): + def test_root_redirects_to_admin_application(self) -> None: + response = TestClient(app).get("/", follow_redirects=False) + + self.assertEqual(response.status_code, 307) + self.assertEqual(response.headers["location"], "/admin/") + def test_schema_routes_remain_available(self) -> None: paths = {route.path for route in app.routes}