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, packages, pages, printers, scripts, session, web, ) 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) app.include_router(web.router)