"""Einstiegspunkt der moneyfy-Anwendung.""" import logging from collections.abc import AsyncGenerator from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from app.api.router import api_router from app.core.config import settings from app.core.errors import register_exception_handlers from app.db.session import SessionLocal, engine from app.services.auth import ensure_admin_user, purge_expired_refresh_tokens logging.basicConfig( level=logging.DEBUG if settings.debug else logging.INFO, format="%(asctime)s %(levelname)-8s %(name)s: %(message)s", ) logger = logging.getLogger("moneyfy") @asynccontextmanager async def lifespan(_: FastAPI) -> AsyncGenerator[None, None]: """Start- und Stopplogik der Anwendung.""" settings.logo_storage_dir.mkdir(parents=True, exist_ok=True) await _bootstrap() logger.info("moneyfy %s gestartet (%s)", settings.app_version, settings.environment) yield await engine.dispose() logger.info("moneyfy wird beendet") async def _bootstrap() -> None: """Erststart: Administrator anlegen und abgelaufene Sitzungen aufräumen. Fehler werden protokolliert, beenden die Anwendung aber nicht – der Health-Check meldet eine nicht erreichbare Datenbank ohnehin. """ try: async with SessionLocal() as session: await ensure_admin_user(session) removed = await purge_expired_refresh_tokens(session) await session.commit() if removed: logger.info("%d abgelaufene Sitzungen entfernt.", removed) except Exception: logger.exception("Start-Initialisierung fehlgeschlagen.") def create_app() -> FastAPI: app = FastAPI( title="moneyfy", version=settings.app_version, description="Planung monatlicher Kosten und Einkünfte.", openapi_url="/api/openapi.json", docs_url="/api/docs", redoc_url=None, lifespan=lifespan, ) if settings.cors_origin_list: app.add_middleware( CORSMiddleware, allow_origins=settings.cors_origin_list, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) register_exception_handlers(app) app.include_router(api_router) return app app = create_app()