# backend/app/api/v1/endpoints/billing.py from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select from app.api.deps import get_db, get_current_user from app.models.identity import User, Wallet, UserRole from app.models.audit import FinancialLedger from app.services.config_service import config router = APIRouter() @router.post("/upgrade") async def upgrade_account(target_package: str, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user)): """ Univerzális csomagváltó. Kezeli az 5+ csomagot, a Rank-ugrást és a különleges 'Service Coin' bónuszokat. """ # 1. Lekérjük a teljes csomagmátrixot az adminból # Példa JSON: {"premium": {"price": 2000, "rank": 5, "type": "credit"}, "service_pro": {"price": 10000, "rank": 30, "type": "coin"}} package_matrix = await config.get_setting(db, "subscription_packages_matrix") if target_package not in package_matrix: raise HTTPException(status_code=400, detail="Érvénytelen csomagválasztás.") pkg_info = package_matrix[target_package] price = pkg_info["price"] # 2. Pénztárca ellenőrzése stmt = select(Wallet).where(Wallet.user_id == current_user.id) wallet = (await db.execute(stmt)).scalar_one_or_none() total_balance = wallet.purchased_credits + wallet.earned_credits if total_balance < price: raise HTTPException(status_code=402, detail="Nincs elég kredited a csomagváltáshoz.") # 3. Levonási logika (Purchased -> Earned sorrend) if wallet.purchased_credits >= price: wallet.purchased_credits -= price else: remaining = price - wallet.purchased_credits wallet.purchased_credits = 0 wallet.earned_credits -= remaining # 4. Speciális Szerviz Logika (Service Coins) # Ha a csomag típusa 'coin', akkor a szerviz kap egy kezdő Coin csomagot is if pkg_info.get("type") == "coin": initial_coins = pkg_info.get("initial_coin_bonus", 100) wallet.service_coins += initial_coins logger.info(f"User {current_user.id} upgraded to Service Pro, awarded {initial_coins} coins.") # 5. Rang frissítése és naplózás current_user.role = target_package # Pl. 'service_pro' vagy 'vip' db.add(FinancialLedger( user_id=current_user.id, amount=-price, transaction_type=f"UPGRADE_{target_package.upper()}", details=pkg_info )) await db.commit() return {"status": "success", "package": target_package, "rank_granted": pkg_info["rank"]}