63 lines
2.6 KiB
Python
Executable File
63 lines
2.6 KiB
Python
Executable File
# 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"]} |