from __future__ import annotations from contextlib import asynccontextmanager from typing import Iterator import uvicorn from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fan_passport.config import Settings, get_settings from fan_passport.database import configure_database, init_db from fan_passport.errors import register_error_handlers from fan_passport.api.routes import router def create_app(settings: Settings | None = None) -> FastAPI: active_settings = settings or get_settings() configure_database(active_settings.database_url) @asynccontextmanager async def lifespan(_: FastAPI) -> Iterator[None]: if active_settings.auto_create_tables: init_db() yield app = FastAPI( title=active_settings.app_name, version="0.1.0", description="Backend MVP and gamification engine for Fan Passport.", lifespan=lifespan, ) app.state.settings = active_settings if active_settings.cors_origins: app.add_middleware( CORSMiddleware, allow_origins=active_settings.cors_origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) register_error_handlers(app) app.include_router(router) return app app = create_app() def run() -> None: uvicorn.run("fan_passport.main:app", host="0.0.0.0", port=8000, reload=False)