Files
mousehold/apps/api/mousehold_api/routers/recurring.py
2026-06-28 13:48:15 +02:00

76 lines
2.5 KiB
Python

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}