from fastapi import FastAPI, Request from fastapi.templating import Jinja2Templates from fastapi.staticfiles import StaticFiles from contextlib import asynccontextmanager from src.services.postgresql_manager import PostgreSQLManager from alembic.config import Config from alembic import command import os # Create application lifespan to handle startup/shutdown @asynccontextmanager async def lifespan(app: FastAPI): # Startup # Run database migrations alembic_cfg = Config("alembic.ini") database_url = os.getenv("DATABASE_URL", "postgresql://postgres:password@localhost:5432/fitbit_garmin_sync") alembic_cfg.set_main_option("sqlalchemy.url", database_url) command.upgrade(alembic_cfg, "head") # Initialize database tables db_manager = PostgreSQLManager(database_url=database_url) db_manager.init_db() yield # Shutdown # Add any cleanup code here if needed # Create FastAPI app with lifespan app = FastAPI(lifespan=lifespan) # Mount static files app.mount("/static", StaticFiles(directory="static"), name="static") # Initialize templates templates = Jinja2Templates(directory="templates") # Include API routes from src.api.status import router as status_router from src.api.sync import router as sync_router from src.api.setup import router as setup_router from src.api.logs import router as logs_router from src.api.metrics import router as metrics_router from src.api.activities import router as activities_router app.include_router(status_router, prefix="/api") app.include_router(sync_router, prefix="/api") app.include_router(setup_router, prefix="/api") app.include_router(logs_router, prefix="/api") app.include_router(metrics_router, prefix="/api") app.include_router(activities_router, prefix="/api") from fastapi import Request @app.get("/") async def read_root(request: Request): return templates.TemplateResponse("index.html", {"request": request}) @app.get("/setup") async def setup_page(request: Request): return templates.TemplateResponse("setup.html", {"request": request})