import asyncio import logging from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from core.config import settings from core.database import init_db, AsyncSessionLocal from services.mqtt_subscriber import run_subscriber from services.seed import run_all_seeds from api.routes import ( health, sites, readings, alarms, ws, assets, power, env, reports, capacity, generator, fire, cooling, leak, network, maintenance, floor_layout, scenarios, settings as settings_router, ) logging.basicConfig(level=logging.INFO, format="%(asctime)s %(name)s %(levelname)s %(message)s") logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI): logger.info(f"Starting {settings.APP_NAME}") await init_db() async with AsyncSessionLocal() as session: await run_all_seeds(session) # Start MQTT subscriber as a background task task = asyncio.create_task(run_subscriber()) yield task.cancel() try: await task except asyncio.CancelledError: pass logger.info("Shutdown complete") app = FastAPI( title=settings.APP_NAME, version="0.2.0", docs_url="/docs", redoc_url="/redoc", lifespan=lifespan, ) app.add_middleware( CORSMiddleware, allow_origins=settings.CORS_ORIGINS, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) app.include_router(health.router, prefix="/api", tags=["health"]) app.include_router(sites.router, prefix="/api/sites", tags=["sites"]) app.include_router(readings.router, prefix="/api/readings", tags=["readings"]) app.include_router(alarms.router, prefix="/api/alarms", tags=["alarms"]) app.include_router(ws.router, prefix="/api", tags=["websocket"]) app.include_router(assets.router, prefix="/api/assets", tags=["assets"]) app.include_router(power.router, prefix="/api/power", tags=["power"]) app.include_router(env.router, prefix="/api/env", tags=["env"]) app.include_router(reports.router, prefix="/api/reports", tags=["reports"]) app.include_router(capacity.router, prefix="/api/capacity", tags=["capacity"]) app.include_router(generator.router, prefix="/api/generator", tags=["generator"]) app.include_router(fire.router, prefix="/api/fire", tags=["fire"]) app.include_router(cooling.router, prefix="/api/cooling", tags=["cooling"]) app.include_router(leak.router, prefix="/api/leak", tags=["leak"]) app.include_router(network.router, prefix="/api/network", tags=["network"]) app.include_router(maintenance.router, prefix="/api/maintenance", tags=["maintenance"]) app.include_router(floor_layout.router, prefix="/api/floor-layout", tags=["floor-layout"]) app.include_router(scenarios.router, prefix="/api/scenarios", tags=["scenarios"]) app.include_router(settings_router.router, prefix="/api/settings", tags=["settings"])