from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.openapi.utils import get_openapi # 1. Konfiguráció importálása from app.core.config import settings # 2. Adatbázis importok from app.db.base import Base from app.db.session import engine # 3. Router importálása from app.api.v1.router import api_router # --- Lifespan (Életciklus) Kezelő --- @asynccontextmanager async def lifespan(app: FastAPI): # INDÍTÁS (Startup): Táblák létrehozása fejlesztői módban async with engine.begin() as conn: # Importáljuk a modelleket, hogy a Base tudjon róluk! from app.models import social, vehicle, user, logistics, expense print("--- Adatbázis táblák ellenőrzése és létrehozása ---") await conn.run_sync(Base.metadata.create_all) yield # Itt fut az alkalmazás... # LEÁLLÁS (Shutdown): Erőforrások elengedése print("--- Traffic Ecosystem SuperApp leállítása ---") await engine.dispose() # --- Alkalmazás Inicializálása --- app = FastAPI( title=settings.PROJECT_NAME, version=settings.VERSION, openapi_url=f"{settings.API_V1_STR}/openapi.json", lifespan=lifespan, # Ez a beállítás segít, hogy a lakat megmaradjon frissítés után is swagger_ui_parameters={"persistAuthorization": True} ) # --- OpenAPI Biztonsági Séma (Hogy legyen Authorize gomb!) --- def custom_openapi(): if app.openapi_schema: return app.openapi_schema openapi_schema = get_openapi( title=app.title, version=app.version, description="API dokumentáció JWT hitelesítéssel", routes=app.routes, ) # Itt definiáljuk a lakatot és a JWT formátumot openapi_schema["components"]["securitySchemes"] = { "OAuth2PasswordBearer": { "type": "oauth2", "flows": { "password": { "tokenUrl": "/api/v1/auth/login" } } } } # Globálisan alkalmazzuk minden védett végpontra for path in openapi_schema["paths"]: for method in openapi_schema["paths"][path]: # Csak azokra a kérésekre rakunk lakatot, amik nincsenek a kivételek között # (Az auth/login és auth/register maradjon nyitva) if not any(x in path for x in ["/auth/login", "/auth/register"]): openapi_schema["paths"][path][method]["security"] = [{"OAuth2PasswordBearer": []}] app.openapi_schema = openapi_schema return app.openapi_schema # Felülírjuk az alapértelmezett OpenAPI generátort a sajátunkkal app.openapi = custom_openapi # --- Middleware (CORS) --- app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # --- Routerek csatolása --- app.include_router(api_router, prefix=settings.API_V1_STR) # --- Gyökér végpont --- @app.get("/") async def root(): return { "message": "Traffic Ecosystem SuperApp API fut", "version": settings.VERSION, "docs_url": "/docs" }