feat(backend): GET /api/v1/persons/me Endpunkt und person_id-Quelle #80

Closed
opened 2026-06-22 15:06:01 +00:00 by niboer · 1 comment
Owner

Beschreibung

Neuer selbst-bewusster Endpunkt GET /api/v1/persons/me der das aktuell authentifizierte User-Profil inklusive Email zurueckgibt. Der Callback nutzt diesen Endpunkt um person_id, user_name und user_email Cookies zu setzen -- statt diese aus dem JWT zu extrahieren. Damit wird die korrekte DB-UUID (personId) fuer nachfolgende API-URLs verwendet.

Hintergrund

Die hooks.server.ts setzt aktuell personId = preferred_username aus dem JWT (z. B. "max.mustermann"). API-URLs wie /api/v1/persons/max.mustermann/invitations landen dann im Backend, wo die DB-UUID erwartet wird -> Prisma-Fehler "invalid input syntax for type uuid".

Backend: Neuer Endpunkt

GET /api/v1/persons/me Authorization: Bearer

  • preHandler:
    equireAuth (legt
    equest.user.personId korrekt anhand keycloakId-Mapping fest)
  • Fetch person + contactData (fuer Email, entschl�sselt)
  • Response (neues Schema CurrentUser):
    {
    "personId": "81e29f0f-08e0-4932-89a6-3aae678ca805",
    "firstName": "Max",
    "lastName": "Mustermann",
    "email": "max@test.de"
    }
  • Fehlerfaelle: 401 (kein Token), 404 (Person nicht in DB)

Frontend: Callback (+server.ts)

Nach dem Token-Erhalt wird BACKEND_ORIGIN/api/v1/persons/me mit dem frischen access_token als Authorization: Bearer aufgerufen und folgende Cookies gesetzt:

Cookie Wert Fallback
person_id me.personId payload.sub aus JWT
user_name me.firstName + " " + me.lastName payload.name
user_email me.email (oder "") payload.email aus JWT

Frontend: hooks.server.ts

personId wird aus dem person_id-Cookie gelesen statt aus dem JWT. Fallback: payload.sub (Keycloak-UUID, falls Cookie fehlt z. B. bei bestehenden Sessions).

Betroffene Dateien

  • backend/openapi.yaml -- CurrentUser Schema + Pfad
  • backend/src/routes/persons.ts -- neuer Endpunkt
  • backend/src/tests/persons.test.ts -- Tests
  • frontend/src/routes/callback/+server.ts -- /me-Call
  • frontend/src/hooks.server.ts -- person_id-Cookie statt JWT
  • frontend/src/tests/hooks.server.test.ts -- Tests anpassen

Akzeptanzkriterien

  • GET /api/v1/persons/me gibt personId/firstName/lastName/email zurueck
  • email ist null wenn keine ContactData existieren
  • Callback setzt person_id-Cookie mit korrekter DB-UUID
  • Callback setzt user_name aus firstName + lastName
  • hooks.server.ts nutzt person_id-Cookie
  • API-URLs im Frontend enthalten die korrekte UUID, nicht den Usernamen
  • Alle Tests laufen gruen
## Beschreibung Neuer selbst-bewusster Endpunkt GET /api/v1/persons/me der das aktuell authentifizierte User-Profil inklusive Email zurueckgibt. Der Callback nutzt diesen Endpunkt um person_id, user_name und user_email Cookies zu setzen -- statt diese aus dem JWT zu extrahieren. Damit wird die korrekte DB-UUID (personId) fuer nachfolgende API-URLs verwendet. ## Hintergrund Die hooks.server.ts setzt aktuell personId = preferred_username aus dem JWT (z. B. "max.mustermann"). API-URLs wie /api/v1/persons/max.mustermann/invitations landen dann im Backend, wo die DB-UUID erwartet wird -> Prisma-Fehler "invalid input syntax for type uuid". ## Backend: Neuer Endpunkt GET /api/v1/persons/me Authorization: Bearer - preHandler: equireAuth (legt equest.user.personId korrekt anhand keycloakId-Mapping fest) - Fetch person + contactData (fuer Email, entschl�sselt) - Response (neues Schema CurrentUser): { "personId": "81e29f0f-08e0-4932-89a6-3aae678ca805", "firstName": "Max", "lastName": "Mustermann", "email": "max@test.de" } - Fehlerfaelle: 401 (kein Token), 404 (Person nicht in DB) ## Frontend: Callback (+server.ts) Nach dem Token-Erhalt wird BACKEND_ORIGIN/api/v1/persons/me mit dem frischen access_token als Authorization: Bearer aufgerufen und folgende Cookies gesetzt: | Cookie | Wert | Fallback | |---------|------|----------| | person_id | me.personId | payload.sub aus JWT | | user_name | me.firstName + " " + me.lastName | payload.name | | user_email | me.email (oder "") | payload.email aus JWT | ## Frontend: hooks.server.ts personId wird aus dem person_id-Cookie gelesen statt aus dem JWT. Fallback: payload.sub (Keycloak-UUID, falls Cookie fehlt z. B. bei bestehenden Sessions). ## Betroffene Dateien - backend/openapi.yaml -- CurrentUser Schema + Pfad - backend/src/routes/persons.ts -- neuer Endpunkt - backend/src/__tests__/persons.test.ts -- Tests - frontend/src/routes/callback/+server.ts -- /me-Call - frontend/src/hooks.server.ts -- person_id-Cookie statt JWT - frontend/src/tests/hooks.server.test.ts -- Tests anpassen ## Akzeptanzkriterien - [ ] GET /api/v1/persons/me gibt personId/firstName/lastName/email zurueck - [ ] email ist null wenn keine ContactData existieren - [ ] Callback setzt person_id-Cookie mit korrekter DB-UUID - [ ] Callback setzt user_name aus firstName + lastName - [ ] hooks.server.ts nutzt person_id-Cookie - [ ] API-URLs im Frontend enthalten die korrekte UUID, nicht den Usernamen - [ ] Alle Tests laufen gruen
niboer self-assigned this 2026-06-22 15:06:01 +00:00
Author
Owner

Auth auf oauth2 geändert in e3c87ab632

Auth auf oauth2 geändert in e3c87ab632
Sign in to join this conversation.
No description provided.