Source code for ccbenefits.routers.usage
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from ..database import get_db
from ..dependencies import get_current_user
from ..models import BenefitTemplate, BenefitUsage, RedemptionType, User
from ..schemas import BenefitUsageOut, BenefitUsageUpdate
router = APIRouter(prefix="/api/usage", tags=["usage"])
def _verify_usage_ownership(usage: BenefitUsage, current_user: User) -> None:
"""Verify the usage record belongs to the current user via UserCard relationship."""
if not usage.user_card or usage.user_card.user_id != current_user.id:
raise HTTPException(status_code=404, detail="Usage record not found")
[docs]
@router.put("/{usage_id}", response_model=BenefitUsageOut)
def update_usage(
usage_id: int,
data: BenefitUsageUpdate,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
):
usage = db.query(BenefitUsage).filter(BenefitUsage.id == usage_id).first()
if not usage:
raise HTTPException(status_code=404, detail="Usage record not found")
_verify_usage_ownership(usage, current_user)
benefit = db.query(BenefitTemplate).filter(BenefitTemplate.id == usage.benefit_template_id).first()
if data.amount_used is not None:
amount = data.amount_used
if benefit and benefit.redemption_type == RedemptionType.binary:
amount = benefit.max_value if amount > 0 else 0.0
if benefit and amount > benefit.max_value:
raise HTTPException(
status_code=400,
detail=f"Amount {amount} exceeds max value {benefit.max_value}",
)
usage.amount_used = amount
if data.notes is not None:
usage.notes = data.notes
db.commit()
db.refresh(usage)
return BenefitUsageOut(
id=usage.id,
benefit_template_id=usage.benefit_template_id,
benefit_name=benefit.name if benefit else "Unknown",
period_start_date=usage.period_start_date,
period_end_date=usage.period_end_date,
amount_used=usage.amount_used,
notes=usage.notes,
created_at=usage.created_at,
)
[docs]
@router.delete("/{usage_id}", status_code=204)
def delete_usage(
usage_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(get_current_user),
):
usage = db.query(BenefitUsage).filter(BenefitUsage.id == usage_id).first()
if not usage:
raise HTTPException(status_code=404, detail="Usage record not found")
_verify_usage_ownership(usage, current_user)
db.delete(usage)
db.commit()