packlist/backend/routes/trip_items.py

59 lines
1.8 KiB
Python

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session, joinedload
from sqlalchemy import func
from uuid import UUID
from backend.database import get_db
from backend import models
from backend.schemas import TripItemOut
router = APIRouter(prefix="/trip-items", tags=["trip-items"])
@router.get("/by-trip/{trip_id}", response_model=list[TripItemOut])
def list_trip_items(trip_id: UUID, db: Session = Depends(get_db)):
trip = db.get(models.Trip, trip_id)
if not trip:
raise HTTPException(status_code=404, detail="Trip not found")
items = (
db.query(models.TripItem)
.options(joinedload(models.TripItem.tag))
.filter(models.TripItem.trip_id == trip_id)
.order_by(
func.regexp_replace(
models.TripItem.name_calculated,
r'^\s*\d+\s*',
''
).asc()
)
.all()
)
return [
TripItemOut(
id=ti.id,
trip_id=ti.trip_id,
item_id=ti.item_id,
name_calculated=ti.name_calculated,
checked=ti.checked,
tag=ti.tag,
) for ti in items
]
@router.post("/{trip_item_id}/toggle", response_model=TripItemOut)
def toggle_trip_item(trip_item_id: UUID, db: Session = Depends(get_db)):
ti = (
db.query(models.TripItem)
.options(joinedload(models.TripItem.tag))
.get(trip_item_id)
)
if not ti:
raise HTTPException(status_code=404, detail="TripItem not found")
ti.checked = not ti.checked
db.commit()
db.refresh(ti)
return TripItemOut(
id=ti.id,
trip_id=ti.trip_id,
item_id=ti.item_id,
name_calculated=ti.name_calculated,
checked=ti.checked,
tag=ti.tag,
)