Backend: Self-Service-Endpunkt GET /events/{id}/guests/me #156

Closed
opened 2026-06-30 19:37:12 +00:00 by niboer · 0 comments
Owner

Beschreibung

Fuer die Self-Service-Tabs "Meine Antwort" und "Mein Zahlungsstatus" auf der Event-Detailseite wird ein neuer Endpunkt benoetigt, der den eigenen Guest-Eintrag (ohne Organisator-Rechte) zurueckgibt.

Endpunkt

GET /api/v1/events/{event_id}/guests/me
Authorization: Bearer <token>

Auth

requireAuth — Jeder authentifizierte User, der ein Gast dieses Events ist, darf seinen eigenen Eintrag sehen.

Response

{
  "eventId": "uuid",
  "personId": "uuid",
  "status": "invited|confirmed|declined",
  "paymentStatus": "open|paid|exempted",
  "contributionEuro": 308.00,
  "formDraft": { ... } | null,
  "formFinal": { ... } | null,
  "formOverride": { ... } | null,
  "respondedAt": "2027-09-01T10:00:00Z" | null,
  "groupId": "uuid" | null,
  "compositeRole": "uuid" | null
}

404 wenn der User kein Gast dieses Events ist.

Aenderungen

backend/src/routes/guests.ts

Neuen GET-Handler nach dem bestehenden GET /guests/:person_id-Endpoint einfuegen:

server.get(
  '/api/v1/events/:event_id/guests/me',
  {
    preHandler: [requireAuth],
    schema: { ... },
  },
  async (request, reply) => {
    const { event_id } = request.params as { event_id: string };
    const personId = request.user!.personId;

    const guest = await prisma.eventGuest.findUnique({
      where: { eventId_personId: { eventId: event_id, personId } },
    });
    if (!guest) {
      return reply.status(404).send({ ... });
    }

    return reply.send(serializeGuest(guest));
  },
);

Wichtig: Der Endpunkt muss vor dem bestehenden GET /guests/:person_id registriert werden, da sonst me als :person_id interpretiert wird. In Fastify werden statische Routen vor dynamischen registriert.

backend/openapi.yaml

Neues Schema SelfGuestResponse und Endpoint-Doku ergaenzen.

Tests (backend/src/__tests__/guests.test.ts)

  • 401 ohne Token
  • 404 wenn User kein Gast
  • 200 bei gueltigem Gast
## Beschreibung Fuer die Self-Service-Tabs "Meine Antwort" und "Mein Zahlungsstatus" auf der Event-Detailseite wird ein neuer Endpunkt benoetigt, der den eigenen Guest-Eintrag (ohne Organisator-Rechte) zurueckgibt. ### Endpunkt ``` GET /api/v1/events/{event_id}/guests/me Authorization: Bearer <token> ``` ### Auth `requireAuth` — Jeder authentifizierte User, der ein Gast dieses Events ist, darf seinen eigenen Eintrag sehen. ### Response ```json { "eventId": "uuid", "personId": "uuid", "status": "invited|confirmed|declined", "paymentStatus": "open|paid|exempted", "contributionEuro": 308.00, "formDraft": { ... } | null, "formFinal": { ... } | null, "formOverride": { ... } | null, "respondedAt": "2027-09-01T10:00:00Z" | null, "groupId": "uuid" | null, "compositeRole": "uuid" | null } ``` 404 wenn der User kein Gast dieses Events ist. ### Aenderungen #### `backend/src/routes/guests.ts` Neuen GET-Handler nach dem bestehenden `GET /guests/:person_id`-Endpoint einfuegen: ```typescript server.get( '/api/v1/events/:event_id/guests/me', { preHandler: [requireAuth], schema: { ... }, }, async (request, reply) => { const { event_id } = request.params as { event_id: string }; const personId = request.user!.personId; const guest = await prisma.eventGuest.findUnique({ where: { eventId_personId: { eventId: event_id, personId } }, }); if (!guest) { return reply.status(404).send({ ... }); } return reply.send(serializeGuest(guest)); }, ); ``` **Wichtig:** Der Endpunkt muss **vor** dem bestehenden `GET /guests/:person_id` registriert werden, da sonst `me` als `:person_id` interpretiert wird. In Fastify werden statische Routen vor dynamischen registriert. #### `backend/openapi.yaml` Neues Schema `SelfGuestResponse` und Endpoint-Doku ergaenzen. ### Tests (`backend/src/__tests__/guests.test.ts`) - 401 ohne Token - 404 wenn User kein Gast - 200 bei gueltigem Gast
Sign in to join this conversation.
No description provided.