Files
midas/backend/app/routers/bankroll.py

60 lines
2.9 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from pydantic import BaseModel
from typing import Optional
from app.database import get_db
from app.models.user import User
from app.models.bankroll import Bankroll
from app.utils.auth import get_current_user
router = APIRouter(prefix="/api/bankroll", tags=["bankroll"])
class BankrollUpdate(BaseModel):
monthly_budget: Optional[float] = None
weekly_limit: Optional[float] = None
daily_limit: Optional[float] = None
bet_max_pct: Optional[float] = None
@router.get("")
async def get_bankroll(user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)):
br = (await db.execute(select(Bankroll).where(Bankroll.user_id == user.id))).scalar_one_or_none()
if not br:
raise HTTPException(404, "Bankroll not configured")
return {
"monthly_budget": float(br.monthly_budget), "weekly_limit": float(br.weekly_limit or 0),
"daily_limit": float(br.daily_limit or 0), "bet_max_pct": float(br.bet_max_pct or 5),
"month_spent": float(br.month_spent or 0), "week_spent": float(br.week_spent or 0),
"day_spent": float(br.day_spent or 0), "current_balance": float(br.current_balance or 0)
}
@router.put("")
async def update_bankroll(req: BankrollUpdate, user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)):
br = (await db.execute(select(Bankroll).where(Bankroll.user_id == user.id))).scalar_one_or_none()
if not br:
raise HTTPException(404, "Bankroll not configured")
if req.monthly_budget is not None: br.monthly_budget = req.monthly_budget
if req.weekly_limit is not None: br.weekly_limit = req.weekly_limit
if req.daily_limit is not None: br.daily_limit = req.daily_limit
if req.bet_max_pct is not None: br.bet_max_pct = req.bet_max_pct
await db.commit()
return {"status": "updated"}
@router.get("/check")
async def check_bankroll(amount: float = Query(...), user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db)):
br = (await db.execute(select(Bankroll).where(Bankroll.user_id == user.id))).scalar_one_or_none()
if not br:
return {"allowed": True, "warnings": []}
warnings = []
monthly_remaining = float(br.monthly_budget) - float(br.month_spent or 0)
if amount > monthly_remaining:
warnings.append(f"Excede limite mensal (restam R${monthly_remaining:.2f})")
if br.weekly_limit and amount > (float(br.weekly_limit) - float(br.week_spent or 0)):
warnings.append("Excede limite semanal")
if br.daily_limit and amount > (float(br.daily_limit) - float(br.day_spent or 0)):
warnings.append("Excede limite diário")
max_bet = float(br.monthly_budget) * float(br.bet_max_pct or 5) / 100
if amount > max_bet:
warnings.append(f"Excede % máximo por aposta (max R${max_bet:.2f})")
return {"allowed": len(warnings) == 0, "warnings": warnings}