63 lines
1.9 KiB
Python
63 lines
1.9 KiB
Python
from fastapi import APIRouter, Depends, HTTPException
|
|
from sqlalchemy.orm import Session, joinedload
|
|
from sqlalchemy import func
|
|
from uuid import UUID
|
|
from database import get_db
|
|
import models
|
|
from 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),
|
|
joinedload(models.TripItem.item).joinedload(models.Item.tags), # <--- Item mit Tags laden
|
|
)
|
|
.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,
|
|
item=ti.item,
|
|
) 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,
|
|
)
|