first ruggedy draft
This commit is contained in:
75
apps/api/mousehold_api/routers/recurring.py
Normal file
75
apps/api/mousehold_api/routers/recurring.py
Normal file
@@ -0,0 +1,75 @@
|
||||
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}
|
||||
Reference in New Issue
Block a user