Przejdź do głównej zawartości

API — Guest Operations

Endpointy operatora wymagają bearer tokenu. Dwa endpointy portalu gościa są publiczne, ale wymagają ważnego tokenu gospodarstwa w ścieżce.

Lista gości

GET /events/{event_id}/guests?search=kowalski
Authorization: Bearer TOKEN

Wyszukiwanie normalizuje wielkość liter i znaki diakrytyczne dla imienia, nazwiska, stołu oraz notatki dietetycznej.

Utworzenie osoby

POST /events/{event_id}/guests
Authorization: Bearer TOKEN
Content-Type: application/json
{
"first_name": "Anna",
"last_name": "Kowalska",
"email": "anna@example.com",
"rsvp": "pending",
"meal_choice": "",
"dietary_notes": "",
"accessibility_notes": "",
"table_name": "",
"is_child": false,
"is_plus_one": false,
"transport_choice": "",
"accommodation_notes": ""
}

Gospodarstwo

POST /events/{event_id}/parties
Authorization: Bearer TOKEN
Content-Type: application/json
{
"name": "Rodzina Kowalskich",
"contact_email": "anna@example.com",
"contact_phone": "+48 500 000 000",
"language": "pl",
"guest_ids": ["GUEST_UUID"]
}

Tworzenie jest transakcyjne. Każdy guest_id musi należeć do tego samego wesela.

Wydanie linku

POST /events/{event_id}/parties/{party_id}/link
Authorization: Bearer TOKEN
{
"party_id": "PARTY_UUID",
"guest_url": "https://splotweselny.pl/w/RAW_PRIVATE_TOKEN",
"expires_at": "2027-09-23T15:30:00+00:00"
}

Każde wywołanie rotuje token. Nie ma endpointu odzyskującego poprzedni surowy token.

Publiczny portal

GET /events/guest-portal/{raw_key}

Możliwe odpowiedzi: 200, 404 dla nieważnego/wyłączonego portalu i 410 dla wygasłego linku.

Publiczne RSVP

POST /events/guest-portal/{raw_key}/rsvp
Content-Type: application/json
{
"guests": [
{
"id": "GUEST_UUID",
"rsvp": "accepted",
"meal_choice": "Roślinne",
"dietary_notes": "Bez orzechów",
"accessibility_notes": "Dostęp bez schodów",
"transport_choice": "Autokar · Centrum",
"accommodation_notes": "1 noc"
}
]
}

Lista może zawierać podzbiór osób gospodarstwa, ale nie może być pusta ani zawierać obcego UUID. Po terminie RSVP endpoint zwraca 409.

Dane operacyjne i check-in

PATCH /events/{event_id}/guests/{guest_id}/operations
Authorization: Bearer TOKEN
Content-Type: application/json
{
"table_name": "Stół 4",
"transport_choice": "Dojazd własny",
"checked_in": true
}

Payload jest częściowy. checked_in: true wymaga aktualnego rsvp: accepted; inaczej API zwraca 422. Cofnięcie przybycia używa checked_in: false.

Inwarianty klienta

  • nie zakładaj, że gość ma gospodarstwo;
  • pokazuj check-in tylko dla accepted;
  • po mutacji użyj zwróconego rekordu jako źródła prawdy;
  • obsłuż 401, 403, 409, 410 i 422 osobno;
  • nie zapisuj guest_url w logach analitycznych;
  • po wysłaniu RSVP odśwież zagregowane liczniki.