from contextlib import asynccontextmanager from pathlib import Path from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from server.routes import hexagons @asynccontextmanager async def lifespan(app: FastAPI): # Startup: preload all parquet files hexagons.preload_dataframes() yield # Shutdown: nothing to clean up app = FastAPI(title="Property Map API", lifespan=lifespan) app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=False, # Cannot use True with wildcard origins allow_methods=["*"], allow_headers=["*"], ) app.include_router(hexagons.router, prefix="/api") # Mount static files for production (frontend build) frontend_dist = Path(__file__).parent.parent / "frontend" / "dist" if frontend_dist.exists(): app.mount("/", StaticFiles(directory=frontend_dist, html=True), name="static")