feat(backend): Merge redesign — MS-BE-DB, MS-BE-KC, MS-BE-API-1 bis MS-BE-API-5 #128

Merged
niboer merged 48 commits from redesign into main 2026-06-26 14:49:00 +02:00
Owner

Sammel-Pull-Request aller MS-BE-*-Meilensteine aus dem redesign-Branch.

Enthaltene Meilensteine

  • MS-BE-DB (#94) — DB-Schema, Gruppen/EventRoles-Tabellen, Seed-Daten
  • MS-BE-KC (#95) — Keycloak-Integration, Composite-Rollen, Auth-Hooks, Gruppen-API
  • MS-BE-API-1 (#20 / #96) — Personen-Endpunkte, Join-Request, User-Link, Archive
  • MS-BE-API-2 (#21 / #97) — Events mit Status, Soft-Delete, Publish
  • MS-BE-API-3 (#22 / #98) — Template-CRUD, Formular-Endpunkte
  • MS-BE-API-4 (#23 / #99) — EventRole-CRUD, compositeRole-Umstellung
  • MS-BE-API-5 (#24 / #100) — Consent, i18n, DSGVO-Guard
  • Fixups: Prisma-JSON-Typecasts, BOM-Entfernung

Sub-Issues

MS-BE-KC (#95)

  • #109 — Composite-Rollen im Keycloak-Realm definieren
  • #110 — request.user.roles und neue Auth-Hooks implementieren
  • #111 — Route-Updates auf neue Auth-Hooks und Gruppen-API

MS-BE-API-1 (#96)

  • #112 — DB-Cleanup: active aus Person entfernen, archivedAt als alleiniges Flag
  • #113 — Join-Request Endpunkte fuer Gruppen
  • #114 — Person-User-Verknuepfungs-Endpunkt
  • #115 — Haushaltswechsel und Personen-Archivierung

MS-BE-API-2 (#97)

  • #116 — openapi.yaml: Event DELETE/PUBLISH Endpunkte und Status-Filter ergaenzen
  • #117 — DELETE /api/v1/events/{id} implementieren (Soft-Delete)
  • #118 — POST /api/v1/events/{id}/publish implementieren
  • #119 — Planning-Mode-Filter und Status-Unterstuetzung in Event-Endpunkten

MS-BE-API-3 (#98)

  • #120 — Datenmodell-Erweiterung: Template + Override-Felder
  • #121 — Formular-Endpunkte: Definition, Draft, Final, Override
  • #122 — Template-CRUD-Endpunkte (global)

MS-BE-API-4 (#99)

  • #123 — systemRole aus eventGuests entfernt, Auth auf compositeRole umgestellt
  • #124 — EventRole-CRUD-Route + Guest-Role-Endpunkt

MS-BE-API-5 (#100)

  • #125 — BE-API-5a: Consent-Endpunkt
  • #126 — BE-API-5b: i18n-Endpunkte
  • #127 — BE-API-5c: DSGVO-Consent-Guard

Closes #94, #95, #20, #21, #22, #23, #24

Sammel-Pull-Request aller MS-BE-*-Meilensteine aus dem redesign-Branch. ## Enthaltene Meilensteine - MS-BE-DB (#94) — DB-Schema, Gruppen/EventRoles-Tabellen, Seed-Daten - MS-BE-KC (#95) — Keycloak-Integration, Composite-Rollen, Auth-Hooks, Gruppen-API - MS-BE-API-1 (#20 / #96) — Personen-Endpunkte, Join-Request, User-Link, Archive - MS-BE-API-2 (#21 / #97) — Events mit Status, Soft-Delete, Publish - MS-BE-API-3 (#22 / #98) — Template-CRUD, Formular-Endpunkte - MS-BE-API-4 (#23 / #99) — EventRole-CRUD, compositeRole-Umstellung - MS-BE-API-5 (#24 / #100) — Consent, i18n, DSGVO-Guard - Fixups: Prisma-JSON-Typecasts, BOM-Entfernung ## Sub-Issues ### MS-BE-KC (#95) - #109 — Composite-Rollen im Keycloak-Realm definieren - #110 — request.user.roles und neue Auth-Hooks implementieren - #111 — Route-Updates auf neue Auth-Hooks und Gruppen-API ### MS-BE-API-1 (#96) - #112 — DB-Cleanup: active aus Person entfernen, archivedAt als alleiniges Flag - #113 — Join-Request Endpunkte fuer Gruppen - #114 — Person-User-Verknuepfungs-Endpunkt - #115 — Haushaltswechsel und Personen-Archivierung ### MS-BE-API-2 (#97) - #116 — openapi.yaml: Event DELETE/PUBLISH Endpunkte und Status-Filter ergaenzen - #117 — DELETE /api/v1/events/{id} implementieren (Soft-Delete) - #118 — POST /api/v1/events/{id}/publish implementieren - #119 — Planning-Mode-Filter und Status-Unterstuetzung in Event-Endpunkten ### MS-BE-API-3 (#98) - #120 — Datenmodell-Erweiterung: Template + Override-Felder - #121 — Formular-Endpunkte: Definition, Draft, Final, Override - #122 — Template-CRUD-Endpunkte (global) ### MS-BE-API-4 (#99) - #123 — systemRole aus eventGuests entfernt, Auth auf compositeRole umgestellt - #124 — EventRole-CRUD-Route + Guest-Role-Endpunkt ### MS-BE-API-5 (#100) - #125 — BE-API-5a: Consent-Endpunkt - #126 — BE-API-5b: i18n-Endpunkte - #127 — BE-API-5c: DSGVO-Consent-Guard Closes #94, #95, #20, #21, #22, #23, #24
refs #94

Aktualisiert die OpenAPI-Schemas (Person, Event, Guest, Invitation,
Group, GroupMember, EventRole) und das SQL-Schema im Design-Dokument
auf UUID-Basis mit event-admin-Rolle, deletedAt, formDraft/formFinal
und neuer consents-Struktur.
refs #94

- Person: archivedAt hinzugefuegt, delegations-Relationen entfernt, groupMembers/groupsCreated-Relationen hinzugefuegt
- Delegation: Modell entfernt
- Group: neues Modell mit createdBy-Relation
- GroupMember: neues Modell mit UNIQUE-Constraint auf personId
- EventRole: neues Modell mit UNIQUE(eventId, name)
- Event: status, deletedAt, roles-Relation hinzugefuegt
- EventGuest: compositeRole (FK->EventRole), groupId (FK->Group), formDraft, formFinal hinzugefuegt
- Consent: targetPersonId in personId umbenannt
refs #94

Alte Migrationen (0001_init, 0002_add_check_constraints) geloescht
und durch eine einzige Migration ersetzt:

- Alle Tabellen: persons, contactData, auditLogs, consents, groups,
  groupMembers, events, eventRoles, eventGuests, invoices
- CHECK-Constraints: events.status (planning/published),
  eventGuests.status (invited/confirmed/declined),
  eventGuests.paymentStatus (open/paid/exempted),
  eventGuests.systemRole (guest/organizer/event-admin)
- GIN-Indizes auf JSONB-Spalten (formDraft, formFinal, formAnswers,
  formDefinition)
refs #94

- Delegation-Eintrag entfernt (durch Group/GroupMember ersetzt)
- Group 'Mustermann-Musterfrau' mit Max (Gruender) und Petra (Mitglied) angelegt
- Event erhaelt status: 'published'
- EventGuest-Eintraege von Max und Petra erhalten groupId
- Consent auf personId/acceptedBy umgestellt
tokens.css auf Lila/Gold-Palette umgestellt.
tokens-whiteblue.css als Kopie des urspruenglichen Blau/Weiss-Schemas.
refs #94

Aktuelles Verhalten: Keine Tests fuer Prisma-Modelle und openapi.yaml-Konsistenz vorhanden.
Neues Verhalten: prisma-models.test.ts prueft alle 7 Modelle auf korrekte Prisma-Exporte. schema-consistency.test.ts validiert openapi.yaml-Schemas gegen Prisma-Generika (Person, Event, Group etc.).
closes #94

Aktuelles Verhalten: Meilenstein MS-BE-DB in AGENTS.md nicht dokumentiert, Issue #94 noch offen.
Neues Verhalten: AGENTS.md fuehrt abgeschlossene Meilensteine auf mit vollstaendiger Aenderungsuebersicht (Modelle, Migration, Seed, Tests).
refs #95
Neue Permission-Rollen (edit-person, edit-user-link, edit-group, edit-event, edit-template, delete-forceevent) und Composite-Rollen (app-admin, event-admin, template-admin) in realm-export.json.
EXPECTED_ROLES in keycloak-provision.ts aktualisiert.
Neue Test-Datei keycloak-roles.test.ts fuer Rollen-Konsistenz.

Aktuelles Verhalten: realm-export.json hat nur app-admin/app-user als simple Rollen.

Neues Verhalten: realm-export.json bildet die Composite-Hierarchie mit Permission-Rollen ab. PROVISION_TEST_ENV=1

closes #109
- jwt.ts: KeycloakJwtPayload-Typ fuer realm_access extrahiert (refs #110)
- auth.ts: roles[] in FastifyRequest.user, Extraction aus realm_access (refs #110)
- auth.ts: requireOwnDataOrGroupMember, requireSelfOrGroupMember, requireGroupMember, requireOrganizerOrEventAdmin, requireCompositeRole, requireOwnDataOrCompositeRole, requireAddressAccess implementiert (refs #110)
- auth.ts: requireOwnDataOrDelegation und requireSelfOrOrganizer entfernt (refs #110)
- Routen: contacts/persons/guests auf neue Hooks umgestellt (refs #111)
- Tests: 206 Tests gruen (23 Files)

Aktuelles Verhalten: Fehlende realm_access-Extraktion, veraltete Delegation-basierte Hooks.

Neues Verhalten: request.user.roles aus JWT, Composite-Rollen-basierte Hooks, Haushalts-Mitgliedschaft ersetzt Delegation.

closes #110
- Neue routes/groups.ts mit 8 Endpunkten (list/create/get/update/delete groups, list/add/remove members) (refs #111)
- app.ts: groupsRoutes registriert (refs #111)
- groups.test.ts: 27 Tests fuer alle Endpunkte (refs #111)
- Alle 233 Tests gruen (24 Files)

Aktuelles Verhalten: Keine Gruppen-API vorhanden.

Neues Verhalten: Vollstaendige CRUD-API unter /api/v1/groups und /api/v1/groups/{group_id}/members mit Composite-Rollen und Haushaltsmitgliedschaft.

closes #111
refs #111

Aktuelles Verhalten:
- guests.ts nutzt requireOrganizer fuer GET/POST guests, GET/DELETE single guest
- events.ts POST erlaubt jedem User Event-Erstellung
- persons.ts POST erlaubt jedem User Person-Erstellung
- contacts.ts GET hat keine Berechtigungspruefung (Sicherheitsluecke)
- groups.ts GET members erfordert Gruppenmitgliedschaft

Neues Verhalten:
- guests.ts: requireOrganizer -> requireOrganizerOrEventAdmin fuer 4 Endpunkte
  (payment bleibt requireOrganizer)
- events.ts POST: requireCompositeRole('edit-event') hinzugefuegt
- persons.ts POST: requireCompositeRole('edit-person') hinzugefuegt
- contacts.ts GET: requireAddressAccess hinzugefuegt
- groups.ts GET members: requireGroupMember entfernt (design.md: nur requireAuth)
refs #111

Aktuelles Verhalten:
- Tests mocken jwt ohne realm_access.roles
- groups.test.ts erwartet 403 fuer GET members ohne Mitgliedschaft

Neues Verhalten:
- events.test.ts: jwt-Mock enthaelt edit-event-Rolle
- persons.test.ts: jwt-Mock enthaelt edit-person-Rolle
- contacts.test.ts: jwt-Mock enthaelt edit-person-Rolle
- groups.test.ts: GET members ohne Mitgliedschaft gibt 200 statt 403
- Kommentare in guests.test.ts aktualisiert
closes #111

Bezug zu 1d7ffb9: Route-Aenderungen (requireCompositeRole fuer POST persons/events)
Bezug zu 857fd46: Test-Anpassungen fuer guests, events, persons, contacts

Aktuelles Verhalten: Integrationstest verwendet JWT-Mock ohne
realm_access.roles -> POST /api/v1/persons und POST /api/v1/events
erhalten 403 Forbidden (requireCompositeRole schlaegt fehl).

Neues Verhalten: JWT-Mock enthaelt edit-person und edit-event in
realm_access.roles -> alle 233 Tests gruen.
refs #19

Context Preservation als verbindlichen Arbeitsablauf in AGENTS.md
aufgenommen (Abschnitt vor Task-Tracking). PROJECT_STATE.md
vollstaendig ueberarbeitet: MS-BE-KC als Done markiert, alle Issues
mit direkten Gitea-Links versehen, neue Struktur mit Done/
Entscheidungen/Next Tasks/Bekannte Probleme.

Aktuelles Verhalten: AGENTS.md enthielt keine Context-Preservation-Regeln.
PROJECT_STATE.md hatte keine Gitea-Links und keine strukturierten Sektionen.
Neues Verhalten: Context Preservation in AGENTS.md definiert.
PROJECT_STATE.md enthaelt Gitea-Links, Done-Sektion, Entscheidungen,
Next Tasks und bekannte Probleme.
refs #112

- Prisma Schema: active-Feld entfernt
- Migration 0001_full_schema: active-Spalte entfernt
- openapi.yaml: active aus Person-Schema entfernt
- GET /api/v1/persons: Query-Parameter von ?active= auf ?archived= umgestellt
  (archived=true = archivedAt IS NOT NULL, archived=false = archivedAt IS NULL)
- Tests und Seed-Daten an active->archivedAt angepasst
- PROJECT_STATE.md aktualisiert

Aktuelles Verhalten: Person-Modell hatte sowohl active (Boolean) als auch archivedAt (DateTime)
Neues Verhalten: Nur noch archivedAt bestimmt den Archivierungsstatus
closes #112

- active-Feld aus Person entfernt
- GET /persons Query auf ?archived= umgestellt
- Alle 233 Tests gruen
refs #96
closes #113

- openapi.yaml: JoinRequestAction-Schema, POST /groups/{id}/join-request,
  PUT /groups/{id}/join-request/{pid}
- routes/groups.ts: joinRequestHandler implementiert (pending/approve/reject)
- groups.test.ts: 11 neue Tests fuer Join-Request (246 Tests gruen)
- PROJECT_STATE.md: #113 als Erledigt markiert

Aktuelles Verhalten: Keine Join-Request-Endpunkte vorhanden
Neues Verhalten: Beitrittsanfragen koennen erstellt, genehmigt und
abgelehnt werden
refs #96
closes #114

- openapi.yaml: UserLinkRequest-Schema, PUT /persons/{pid}/user-link,
  Error409-Schema, Conflict-Response
- routes/persons.ts: updateUserLink-Handler mit Unique-Constraint-Handling
- persons.test.ts: 5 neue Tests fuer User-Link (252 Tests gruen)
- PROJECT_STATE.md: #114 als Erledigt markiert

Aktuelles Verhalten: Kein Endpunkt zum Setzen/Entfernen der Keycloak-ID
Neues Verhalten: App-Admin kann keycloakId via PUT /persons/{pid}/user-link
setzen oder auf null setzen (Unique-Constraint wird via 409 Conflict gemeldet)
refs #96
closes #115

- openapi.yaml: SwitchGroupRequest-Schema, POST /persons/{pid}/archive,
  POST /persons/{pid}/switch-group
- routes/persons.ts: archivePerson- und switchGroup-Handler
- persons.test.ts: 13 neue Tests (archive + switch-group, 265 Tests gruen)
- PROJECT_STATE.md: #115 als Erledigt markiert, MS-BE-API-1 abgeschlossen

Aktuelles Verhalten: Keine Archive-/Switch-Group-Endpunkte
Neues Verhalten: Eigene Person kann archiviert werden (setzt archivedAt);
  Haushalt kann gewechselt werden (loescht alte GroupMember, erstellt neue)
closes #96

Alle vier Sub-Issues (#112, #113, #114, #115) implementiert und getestet.
265 Tests gruen. Naechster Meilenstein: MS-BE-API-2 (#21 / #97).
- MS-BE-DB (#94) aus Schnellzugriff und Done entfernt
- Sub-Issue-Links (#109, #110, #111) aus Schnellzugriff entfernt
- MS-BE-API-1 aus Next-Tasks-Tabelle entfernt (abgeschlossen)
- Archived-Query-Param-Diskrepanz in openapi.yaml
- Fehlende Transaktion in switch-group
- Uneinheitliches Response-Format bei Join-Request-Reject
refs #116

Aktuelles Verhalten: openapi.yaml definiert nur GET/POST/PUT fuer Events, DELETE und PUBLISH fehlen
Neues Verhalten: DELETE /api/v1/events/{event_id} (204) und POST /api/v1/events/{event_id}/publish (200) definiert; GET-Beschreibung auf Planning-Mode-Filter aktualisiert

closes #116
refs #117

Aktuelles Verhalten: DELETE /api/v1/events/{event_id} fehlt. Events koennen nicht geloescht werden.
Neues Verhalten: DELETE-Endpunkt mit Soft-Delete (deletedAt) fuer planning-Events implementiert.
Nur Organisator darf loeschen. Published-Events geben 403 mit Hinweis auf force.
5 Tests: 204, 401, 404 unbekannt, 403 published, 404 bereits geloescht.

closes #117
refs #118

Aktuelles Verhalten: POST /api/v1/events/{event_id}/publish fehlt. Events koennen nicht veroefentlicht werden.
Neues Verhalten: PUBLISH-Endpunkt setzt Status von planning auf published.
Nur Organisator darf publishen. Bereits published gibt 400, deleted/unknown gibt 404.
5 Tests: 200, 400, 404 unbekannt, 404 geloescht, 401.

closes #118
refs #119

Aktuelles Verhalten: GET /events zeigt planning-Events fuer alle; GET /events/:event_id zeigt auch
geloeschte und planning-Events; POST/PUT ignorieren status-Feld.

Neues Verhalten:
- GET /events: filtert deleted-Events (deletedAt IS NULL) und planning-Events
  (nur sichtbar fuer Organisator/Event-Admin via guests.some-Relation)
- GET /events/:event_id: 404 bei geloeschtem oder planning-Event ohne Berechtigung
- POST /events: akzeptiert optionales status-Feld aus Body
- PUT /events/:event_id: akzeptiert optionales status-Feld
- EVENT_FIELDS_WHITELIST um status erweitert

4 neue Tests: Planning-Filter, Deleted-Filter, Geloescht-404, Planning-404.
Vorhandene Tests auf status-Feld in Mock-Daten aktualisiert.

closes #119
refs #97

Aktuelles Verhalten: MS-BE-API-2 war offen mit 5 offenen Aufgaben.
Neues Verhalten: Alle Aufgaben umgesetzt — openapi.yaml erweitert,
DELETE (Soft-Delete), PUBLISH (Status-Transition), Planning-Mode-Filter,
Status-Unterstuetzung in CRUD. 281 Tests gruen.

- #116: openapi.yaml DELETE/PUBLISH Endpunkte
- #117: DELETE /api/v1/events/{id} mit Soft-Delete
- #118: POST /api/v1/events/{id}/publish
- #119: Planning-Mode-Filter + Status in CRUD

closes #97
- Prisma: Template-Tabelle + Relation zu Person, formOverride (JSONB) zu EventGuest, formAnswers entfernt
- Migration: 0001_full_schema mit Template-Tabelle, FK zu Person, GIN-Index auf formOverride
- Seed: Beispiel-Template Standard-Anmeldeformular
- openapi.yaml: Template/CreateTemplate/UpdateTemplate-Schemas, formOverride bei Guest/Invitation
- Routes: formAnswers aus PUT-Status-Update entfernt, in invitations durch formOverride ersetzt
- Tests: Alle Referenzen aktualisiert, Template-Modell-Test, Schema-Consistency-Test

closes #120
- openapi.yaml: 4 neue Schemas (FormDraftRequest, FormFinalRequest, FormOverrideRequest, FormDefinitionRequest) + 6 Pfade
- forms.ts: GET/PUT form-draft, PUT form-final, PUT form-override, GET/PUT event-form mit korrekten Auth-Hooks
- app.ts: formsRoutes registriert
- forms.test.ts: 30 Tests fuer 401/403/404/200 aller Endpunkte
- PROJECT_STATE.md aktualisiert

closes #121
refs #122

Aktuelles Verhalten: Template-Modell und -Schemas vorhanden, aber keine CRUD-Endpunkte.
Neues Verhalten: 5 Endpunkte (GET/POST /api/v1/templates, GET/PUT/DELETE /api/v1/templates/{template_id}) mit requireAuth/requireCompositeRole('edit-template')-Auth. 18 Tests. 337 Tests gruen.
refs #122

Aktuelles Verhalten: Auth-Matrix §5.1 zeigt noch per-Event-Pfade
(/api/v1/events/{event_id}/templates) fuer Templates.
Neues Verhalten: Globale Pfade (/api/v1/templates,
/api/v1/templates/{template_id}) mit korrekten Auth-Hooks.
refs #99

Neue Sub-Issues:
- #123: systemRole aus eventGuests entfernen, Auth auf compositeRole umstellen
- #124: EventRole-CRUD-Route + Guest-Role-Endpunkt

PROJECT_STATE: Aktivitaet auf MS-BE-API-4 verschoben, #123/#124 eingetragen.
AGENTS: Auth-Hook-Beschreibung auf compositeRole.permissions-Logik umgestellt.
design.md: EventRole-Endpunkte in Auth-Matrix §5.1, systemRole aus Schema entfernt.
closes #123

systemRole (guest/organizer/event-admin) aus Prisma-Schema, Migration,
Seed, openapi.yaml und saemtlichen Routes/Tests entfernt.

Neuer hasEventPermission()-Helper in auth.ts prueft via
event.createdBy (Owner-Prinzip) oder compositeRole.permissions-JSONB.

Alle Auth-Hooks (requireOrganizer, requireOrganizerOrEventAdmin,
requireSelfOrGroupMember, requireAddressAccess) auf neuen Helper
umgestellt. Event-Filter nutzen eventRole.permissions.array_contains.

Event-Erstellung legt automatisch EventRole 'Organizer' an.

Aktuelles Verhalten: systemRole-Spalte mit CHECK-Constraint, Auth via
String-Vergleich auf eventGuests.systemRole.
Neues Verhalten: Kein systemRole-Feld mehr; Berechtigung via
event.createdBy oder EventRole.permissions-Array (JSONB).
closes #124

- openapi.yaml: 7 neue Pfade, 3 neue Schemas (UpdateEventRole,
  GuestRoleResponse, UpdateGuestRole)
- event-roles.ts: 5 CRUD-Endpunkte (GET/POST list+create, GET single,
  PUT update, DELETE) mit Auth-Hooks (DELETE requireOrganizer, rest
  requireOrganizerOrEventAdmin)
- guests.ts: role-Endpunkt GET+PUT fuer EventGuest-Role
- event-roles.test.ts: 24 Tests (401/403/404/409/200/201/204) fuer
  alle Endpunkte
- guests.test.ts: 4 neue Tests fuer Guest-Role-Umbesetzung
- PROJECT_STATE.md: MS-BE-API-4 (#99) als abgeschlossen markiert,
  #124 in Done aufgenommen, naechster Meilenstein MS-BE-API-5

Aktuelles Verhalten: EventRoles koennen nicht via API verwaltet
werden; Guest-Role ist hartcodiert als systemRole.
Neues Verhalten: EventRoles werden per CRUD-Route verwaltet; Guest-
Role wird dynamisch aus eventRoles-Tabelle via compositeRole-ID
zugewiesen systemRole ist vollstaendig entfernt.
refs #100, #125

Aktuelles Verhalten: openapi.yaml ohne Consent-Endpunkt; Migration ohne CHECK-Constraints/GIN-Indizes; requireConsent-Hook undokumentiert

Neues Verhalten: ConsentRequest/ConsentResponse-Schema + PUT-Pfad in openapi.yaml; Migration mit korrekten Constraints und Indizes; requireConsent-Hook in design.md-Hook-Tabelle dokumentiert
refs #100, #125

PUT /api/v1/events/{event_id}/guests/{person_id}/consent mit
requireAuth + requireSelfOrGroupMember. Prueft Gast-Existenz (404),
erzeugt Consent-Eintrag via prisma.consent.create() (mehrere Consents
pro Person erlaubt, PK ist consentId). acceptedBy optional im Body,
Fallback auf request.user.personId. 7 Tests (401/403/404/200).
closes #125

consent.test.ts neu mit 7 Tests (401/403/404/200-Selbst/
200-Haushalt/200-Organisator/200-acceptedBy).
Consent-Tests aus guests.test.ts entfernt.
schema-consistency.test.ts: ConsentRequest + ConsentResponse
in Pruefung aufgenommen.
GET /api/v1/i18n listet verfuegbare Sprachen via Dateisystem-Scan.
GET /api/v1/i18n/{lang} liefert JSON-Uebersetzungen (404 bei unbekannter Sprache).
Beide Endpunkte mit requireAuth geschuetzt.

Tests: 5 i18n-Tests (401/200-Liste/200-DE/200-EN/404-fr).
403 Tests gesamt gruen.

closes #126

refs #100
Neuer Auth-Hook requireConsent() in auth.ts prüft auf DSGVO-Zustimmung
(consent-Eintrag). Gibt 403 'DSGVO-Zustimmung erforderlich' bei fehlendem
Eintrag.

Geschützte GET-Endpunkte:
- /api/v1/persons, /api/v1/persons/:person_id, /api/v1/events,
  /api/v1/events/:event_id, /api/v1/events/:event_id/guests,
  /api/v1/persons/:person_id/contacts, /api/v1/groups,
  /api/v1/groups/:group_id

Ausgenommen: /health, Consent-Endpunkt, i18n, /api/v1/persons/me.

refs #127
refs #100
closes #127

Aktuelles Verhalten: requireConsent-Hook ungetestet, openapi.yaml ohne Consent-403,
Dokumentation ohne Consent-Eintraege
Neues Verhalten: auth.test.ts mit 2 Tests (kein Consent -> 403, Consent -> pass),
ForbiddenConsent-Response in openapi.yaml, design.md-Matrix aktualisiert
refs #100

schema-consistency.test.ts: I18nResponse + I18nLanguagesResponse
in Pruefung aufgenommen (3 neue Tests).
config-consistency.test.ts unveraendert.
no-umlauts.test.ts keine Aenderung noetig (i18n-Dateien
verwenden umlautfreies Deutsch).
PROJECT_STATE.md aktualisiert.

closes #100

Aktuelles Verhalten: 405 Tests, MS-BE-API-5 in Arbeit
Neues Verhalten: 408 Tests, MS-BE-API-5 abgeschlossen
refs #(no-issue)

Aktuelles Verhalten: TypeScript-Fehler bei Prisma-Zugriff auf JSONB-Felder
(formDraft, formFinal, formDefinition); user-request-Typ unvollstaendig.

Neues Verhalten: Typecasts via as any fuer JSONB-Felder in forms- und
templates-Routen; user-Decoration um roles: string[] ergaenzt.
refs #(kein Issue)

Das migration.sql enthielt ein UTF-8 BOM (EF BB BF), das PostgreSQL mit syntax error at or near \\u{feff}\ abwies.

Aktuelles Verhalten: P3018 bei Migration-Apply wegen BOM.

Neues Verhalten: migration.sql ist BOM-frei, PostgreSQL akzeptiert SQL.
refs #(kein Issue)

Drei doppelte Label-Namen bereinigt: component/backend (ID 2+15), prio/medium (ID 8+16), type/bug (ID 10+17).

Aktuelles Verhalten: 16 Labels mit 3 Duplikaten.

Neues Verhalten: 13 eindeutige Labels, keine Duplikate.
niboer merged commit 650cc62316 into main 2026-06-26 14:49:00 +02:00
niboer deleted branch redesign 2026-06-26 14:49:00 +02:00
Sign in to join this conversation.
No description provided.