Source code for ccbenefits.routers.card_templates
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session, joinedload
from ..database import get_db
from ..models import CardTemplate
from ..schemas import CardTemplateListItem, CardTemplateOut
from ..utils import compute_annual_max
router = APIRouter(prefix="/api/card-templates", tags=["card-templates"])
[docs]
@router.get("/", response_model=list[CardTemplateListItem])
def list_card_templates(db: Session = Depends(get_db)):
cards = db.query(CardTemplate).options(joinedload(CardTemplate.benefits)).all()
result = []
for card in cards:
total = sum(
compute_annual_max(b.max_value, b.period_type) for b in card.benefits
)
result.append(
CardTemplateListItem(
id=card.id,
name=card.name,
issuer=card.issuer,
annual_fee=card.annual_fee,
image_url=card.image_url,
benefit_count=len(card.benefits),
total_annual_value=round(total, 2),
)
)
return result
[docs]
@router.get("/{card_template_id}", response_model=CardTemplateOut)
def get_card_template(card_template_id: int, db: Session = Depends(get_db)):
card = (
db.query(CardTemplate)
.options(joinedload(CardTemplate.benefits))
.filter(CardTemplate.id == card_template_id)
.first()
)
if not card:
raise HTTPException(status_code=404, detail="Card template not found")
total = sum(
compute_annual_max(b.max_value, b.period_type) for b in card.benefits
)
return CardTemplateOut(
id=card.id,
name=card.name,
issuer=card.issuer,
annual_fee=card.annual_fee,
image_url=card.image_url,
benefits=[b for b in card.benefits],
total_annual_value=round(total, 2),
)