36 lines
1.3 KiB
Python
36 lines
1.3 KiB
Python
from pathlib import Path
|
|
|
|
from fastapi import APIRouter
|
|
from fastapi.responses import FileResponse, HTMLResponse
|
|
|
|
router = APIRouter()
|
|
DASHBOARD_FILE = Path(__file__).resolve().parent.parent / "frontend" / "index.html"
|
|
MANIFEST_FILE = DASHBOARD_FILE.parent / "manifest.webmanifest"
|
|
SERVICE_WORKER_FILE = DASHBOARD_FILE.parent / "service-worker.js"
|
|
|
|
|
|
class RevalidatingHTMLResponse(HTMLResponse):
|
|
def __init__(self, content, status_code=200, headers=None, media_type=None, background=None):
|
|
response_headers = dict(headers or {})
|
|
response_headers["Cache-Control"] = "no-cache"
|
|
super().__init__(content, status_code, response_headers, media_type, background)
|
|
|
|
|
|
@router.get("/", response_class=RevalidatingHTMLResponse)
|
|
async def dashboard() -> str:
|
|
return DASHBOARD_FILE.read_text()
|
|
|
|
|
|
@router.get("/manifest.webmanifest", response_class=FileResponse)
|
|
async def web_app_manifest() -> FileResponse:
|
|
return FileResponse(MANIFEST_FILE, media_type="application/manifest+json")
|
|
|
|
|
|
@router.get("/service-worker.js", response_class=FileResponse)
|
|
async def service_worker() -> FileResponse:
|
|
return FileResponse(
|
|
SERVICE_WORKER_FILE,
|
|
media_type="application/javascript",
|
|
headers={"Service-Worker-Allowed": "/", "Cache-Control": "no-cache"},
|
|
)
|