From c81e27c60266f8def32f647ca18a81c7f9002929 Mon Sep 17 00:00:00 2001 From: Felipe Cardoso Date: Wed, 19 Mar 2025 19:56:10 +0100 Subject: [PATCH] Add event-specific guest gift reservations endpoint Introduced a function `get_event_guest_gift_reservations` in the CRUD layer to fetch gift reservations filtered by event ID. Updated the API endpoint to optionally accept an `event_id` query parameter for retrieving reservations specific to an event. --- backend/app/api/routes/events/gifts.py | 16 ++++++++---- backend/app/crud/gift.py | 35 ++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/backend/app/api/routes/events/gifts.py b/backend/app/api/routes/events/gifts.py index fea612a..70a6d5c 100644 --- a/backend/app/api/routes/events/gifts.py +++ b/backend/app/api/routes/events/gifts.py @@ -1,7 +1,7 @@ from typing import List, Optional, Dict, Any from uuid import UUID -from fastapi import APIRouter, Depends, HTTPException, Path +from fastapi import APIRouter, Depends, HTTPException, Path, Query from sqlalchemy.orm import Session from app.api.dependencies.auth import get_current_active_user, get_current_user, get_optional_current_user @@ -1050,19 +1050,25 @@ def read_gift_purchases_by_guest( return gift_purchase_crud.get_gift_reservations_by_guest(db, guest_id=guest_id) @router.get( - "/purchases/guest/all", + "/reservations/guests", response_model=List[GiftPurchase], - operation_id="read_guests_gift_purchases" + operation_id="read_guests_gift_reservations", ) def read_all_guest_gift_reservations( *, db: Session = Depends(get_db), + event_id: Optional[str] = Query(None, description="Optional event ID to filter reservations by event"), ) -> Any: """ - Retrieve all guest gift reservations. + Retrieve all guest gift reservations, optionally filtered by event ID. """ - reservations = gift_purchase_crud.get_all_guest_gift_reservations(db=db) + if event_id: + event_id = UUID(event_id) + reservations = gift_purchase_crud.get_event_guest_gift_reservations(db=db, event_id=event_id) + else: + reservations = gift_purchase_crud.get_all_guest_gift_reservations(db=db) if not reservations: reservations = [] + return reservations diff --git a/backend/app/crud/gift.py b/backend/app/crud/gift.py index 6fe1427..b9dc696 100644 --- a/backend/app/crud/gift.py +++ b/backend/app/crud/gift.py @@ -387,6 +387,41 @@ class CRUDGiftPurchase(CRUDBase[GiftPurchase, GiftPurchaseCreate, GiftPurchaseUp return result + def get_event_guest_gift_reservations(self, db: Session, event_id: UUID | str) -> List[GiftPurchase]: + """Retrieve all gift reservations for guests belonging to a specific event.""" + event_id = event_id if isinstance(event_id, UUID) else UUID(event_id) + + stmt = ( + select(Guest) + .where(Guest.event_id == event_id) + .options(joinedload(Guest.gifts)) + ) + + # Correct: Call unique() on the RESULT, not on the stmt + guests = db.execute(stmt).unique().scalars().all() + + results = [] + for guest in guests: + for gift in guest.gifts: + reservation_stmt = select(GuestGifts).where( + (GuestGifts.c.guest_id == guest.id) & + (GuestGifts.c.gift_id == gift.id) + ) + + reservation = db.execute(reservation_stmt).first() + + if reservation: + purchase = GiftPurchase( + id=UUID('00000000-0000-0000-0000-000000000000'), + gift_id=gift.id, + guest_id=guest.id, + quantity=1, + purchased_at=reservation.reserved_at, + notes=reservation.notes + ) + results.append(purchase) + + return results # Create CRUD instances gift_item_crud = CRUDGiftItem(GiftItem)