from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select from sqlalchemy.orm import Session from .. import models from ..db import get_session from ..schemas import ( RecurringCommitmentCreate, RecurringCommitmentRead, RecurringCommitmentUpdate, ) router = APIRouter(tags=["recurring"]) @router.post("/recurring-commitments", response_model=RecurringCommitmentRead) def create_recurring_commitment( payload: RecurringCommitmentCreate, session: Session = Depends(get_session), ) -> models.RecurringCommitment: if not session.get(models.Household, payload.household_id): raise HTTPException(status_code=404, detail="Household not found") commitment = models.RecurringCommitment(**payload.model_dump()) session.add(commitment) session.commit() session.refresh(commitment) return commitment @router.get("/recurring-commitments", response_model=list[RecurringCommitmentRead]) def list_recurring_commitments( household_id: str, session: Session = Depends(get_session), ) -> list[models.RecurringCommitment]: return list( session.scalars( select(models.RecurringCommitment) .where(models.RecurringCommitment.household_id == household_id) .order_by(models.RecurringCommitment.next_due_date) ).all() ) @router.patch("/recurring-commitments/{commitment_id}", response_model=RecurringCommitmentRead) def update_recurring_commitment( commitment_id: str, payload: RecurringCommitmentUpdate, session: Session = Depends(get_session), ) -> models.RecurringCommitment: commitment = session.get(models.RecurringCommitment, commitment_id) if not commitment: raise HTTPException(status_code=404, detail="Recurring commitment not found") for field, value in payload.model_dump(exclude_unset=True).items(): if field == "currency" and value is not None: value = value.upper() setattr(commitment, field, value) session.add(commitment) session.commit() session.refresh(commitment) return commitment @router.delete("/recurring-commitments/{commitment_id}") def delete_recurring_commitment( commitment_id: str, session: Session = Depends(get_session), ) -> dict[str, bool]: commitment = session.get(models.RecurringCommitment, commitment_id) if not commitment: raise HTTPException(status_code=404, detail="Recurring commitment not found") session.delete(commitment) session.commit() return {"deleted": True}