from contextlib import asynccontextmanager from fastapi import FastAPI from slowapi import _rate_limit_exceeded_handler from slowapi.errors import RateLimitExceeded import app.models # noqa: F401 (alle ORM-Modelle vollständig an Base.metadata # registrieren, unabhängig davon, welche Endpunkte tatsächlich verdrahtet sind - # sonst schlägt FK-Auflösung zwischen Modellen fehl, siehe tests/conftest.py) from app.api.v1.api import api_router from app.core.app_settings import settings from app.core.rate_limit import limiter from app.db.session import engine _PLACEHOLDER_JWT_SECRET = "change-me-to-a-long-random-value" @asynccontextmanager async def lifespan(app: FastAPI): if not settings.jwt_secret_key or settings.jwt_secret_key == _PLACEHOLDER_JWT_SECRET: raise RuntimeError( "JWT_SECRET_KEY ist leer oder noch der Platzhalter aus example.env – " "in .env auf dem Zielsystem einen echten zufälligen Wert setzen." ) yield await engine.dispose() app = FastAPI(title="MABEA", version="0.1.0", lifespan=lifespan) app.state.limiter = limiter app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) app.include_router(api_router, prefix="/api/v1")