"""FastAPI admin application.""" from __future__ import annotations import os import subprocess import sys from pathlib import Path from fastapi import FastAPI from fastapi.responses import FileResponse from fastapi.staticfiles import StaticFiles from admin.models import init_db from admin.routes import router app = FastAPI(title="Seed Admin", docs_url=None, redoc_url=None) app.include_router(router) _STATIC = Path(__file__).parent / "static" app.mount("/static", StaticFiles(directory=str(_STATIC)), name="static") _rq_worker: subprocess.Popen[bytes] | None = None @app.on_event("startup") def on_startup() -> None: global _rq_worker init_db() if os.environ.get("SKIP_INTERNAL_WORKER", "").lower() in ("1", "true", "yes"): return redis_url = os.environ.get("REDIS_URL", "redis://localhost:6379/0") _rq_worker = subprocess.Popen( [sys.executable, "-m", "rq", "worker", "--url", redis_url, "batch"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, ) @app.on_event("shutdown") def on_shutdown() -> None: if _rq_worker is not None: _rq_worker.terminate() try: _rq_worker.wait(timeout=5) except subprocess.TimeoutExpired: _rq_worker.kill() @app.get("/") def dashboard() -> FileResponse: return FileResponse(str(_STATIC / "dashboard.html"))