from fastapi import FastAPI, Request from fastapi.staticfiles import StaticFiles from fastapi.middleware.cors import CORSMiddleware from contextlib import asynccontextmanager from database import create_tables, run_migrations, SessionLocal from auth import create_default_admin from routes import auth_router, api_router, web_router from settings_store import get_setting from timezone_utils import set_current_timezone @asynccontextmanager async def lifespan(app: FastAPI): create_tables() run_migrations() db = SessionLocal() try: create_default_admin(db) finally: db.close() yield app = FastAPI( title="InfoUser Monitor", description="PC monitoring dashboard with FastAPI and agents", version="1.0.0", lifespan=lifespan, ) app.mount("/static", StaticFiles(directory="static"), name="static") app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.middleware("http") async def timezone_middleware(request: Request, call_next): """Set current request timezone from DB settings for web rendering.""" db = SessionLocal() try: tz = get_setting(db, "TIMEZONE") if tz: set_current_timezone(tz) else: set_current_timezone("UTC") finally: db.close() return await call_next(request) app.include_router(auth_router) app.include_router(api_router) app.include_router(web_router) @app.get("/health") def health(): return {"status": "ok"}