import os from contextlib import asynccontextmanager from pathlib import Path from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from imptune.api import clients, drivers, health, icons, pages, packages, printers, scripts, session from imptune.config import DATA_DIR, DRIVERS_DIR, ICONS_DIR from imptune.db.database import db, init_db from imptune.services.session import OwnerSessionMiddleware @asynccontextmanager async def lifespan(app: FastAPI): os.makedirs(DATA_DIR, exist_ok=True) os.makedirs(DRIVERS_DIR, exist_ok=True) os.makedirs(ICONS_DIR, exist_ok=True) init_db() yield # Close DB connection on shutdown so test fixtures can re-initialize cleanly if not db.is_closed(): db.close() app = FastAPI(title="ImpTune", lifespan=lifespan) app.add_middleware(OwnerSessionMiddleware) # Serve baked-in static assets (pico.min.css, htmx.min.js, alpine.min.js) _static_dir = Path(__file__).parent / "static" app.mount("/static", StaticFiles(directory=str(_static_dir)), name="static") # Register routers app.include_router(health.router) app.include_router(pages.router) app.include_router(drivers.router) app.include_router(printers.router) app.include_router(clients.router) app.include_router(scripts.router) app.include_router(packages.router) app.include_router(icons.router) app.include_router(session.router)