BMS/backend/main.py
2026-03-19 11:32:17 +00:00

73 lines
2.9 KiB
Python

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"])