| 16-ad-gruppen-synchronisation |
01 |
auth |
| prisma |
| postgresql |
| nestjs |
| ldap |
| ldapts |
| nextjs |
| react |
| rls |
|
| phase |
provides |
| 15-gruppen-und-modulzuweisung |
Group-Modell, forTenant()-RLS-Helper, GroupsService, tenant_isolation_policy auf Group/GroupMembership/ModuleGrant |
|
|
| Group.internalName + Group.ldapObjectGuid Spalten samt Unique-Index (tenantId, ldapObjectGuid), versioniert und lokal angewendet (D-04) |
| LdapService.listGroups(config, tenantId) mit alreadyImported-Flag und stabiler Sortierung |
| LdapService.importGroupsByDn(config, tenantId, dns) — selektiver Import mit Namenskollisions- und Duplikat-Behandlung |
| LdapService.escapeLdapFilterBuffer() — binäres LDAP-Filter-Escaping (noch ungenutzt, Vorbereitung für Plan 16-03) |
| POST /ldap/groups/import Route (RBAC ADMIN/SUPER_ADMIN) |
| Sektion 'AD-Gruppen importieren' in /admin/ldap mit sichtbaren Fehlerzuständen |
|
| 16-02-anzeige-fallback |
| 16-03-rekonziliation |
| 16-04-dialog-umbau |
| 16-05-anzeige-fallback-frontend |
|
| tokens |
tasks |
commits |
| 10020 |
3 |
2 |
|
| added |
patterns |
|
|
| explicitBufferAttributes: ['objectGUID'] bei jeder LDAP-Suche, die objectGUID liest — ldapts würde sonst UTF-8-dekodieren und den 16-Byte-Wert korrumpieren |
| Reject-with-Report je Zeile statt Batch-Abbruch: P2002 auf (tenantId, name) -> nameCollisions, P2002 auf (tenantId, ldapObjectGuid) -> skipped, alles andere -> errors |
| Baselinen einer lokalen Dev-Datenbank via `prisma migrate resolve --applied <name>` je Altmigration, bevor `prisma migrate deploy` nur die neue Migration anwendet — Ersatz für `migrate dev`, das in dieser Shell keine TTY hat |
|
|
| created |
modified |
| apps/api/prisma/migrations/20260806133916_add_group_internal_name_and_object_guid/migration.sql |
|
| apps/api/prisma/schema.prisma |
| apps/api/src/ldap/ldap.service.ts |
| apps/api/src/ldap/ldap.controller.ts |
| apps/api/src/ldap/dto/ldap-config.dto.ts |
| apps/api/src/ldap/ldap.service.spec.ts |
| apps/api/src/groups/migration-sql.spec.ts |
| apps/web/src/app/(portal)/admin/ldap/page.tsx |
| apps/web/src/messages/de.json |
| apps/web/src/messages/en.json |
|
|
| Checkpoint 1 (Task 1, checkpoint:decision): approve-both — beide nullable Spalten (internalName, ldapObjectGuid) plus Unique-Index in einer versionierten Migration. Freigegeben 2026-08-06. |
| Post-Tracer human-verify-Checkpoint: verified — die Tracer-Scheibe (Diff gelesen, alle automatisierten Verifies grün) wurde geprüft und akzeptiert. |
| Drei kosmetische Beobachtungen aus dem Checkpoint-Review bewusst zurückgestellt (siehe Abschnitt unten) — keine davon blockiert die Success Criteria dieses Plans. |
| Migrationsverfahren angepasst: `prisma migrate dev` verweigert in dieser nicht-interaktiven Shell den Betrieb (auch mit CI=true, gepipetem stdin oder --create-only). Statt eine Pseudo-TTY zu erzwingen wurde der äquivalente, nicht-interaktive Weg genutzt: `prisma migrate diff` liefert die exakte SQL, die Migration wurde von Hand als Datei angelegt (Stil identisch zu den bestehenden hand-editierten Migrationen des Repos) und per `prisma migrate deploy` angewendet. |
|
| Nicht-interaktive lokale Migrationen: migrate diff (SQL erzeugen) -> Datei von Hand anlegen -> migrate deploy (anwenden), statt migrate dev in einer Shell ohne TTY |
|
|
| id |
description |
requirement |
verification |
human_judgment |
| D1 |
Group.internalName und Group.ldapObjectGuid existieren in Schema, Migration und laufender lokaler Datenbank samt Unique-Index (tenantId, ldapObjectGuid) (D-04) |
PERM-02 |
| kind |
ref |
status |
| unit |
apps/api/src/groups/migration-sql.spec.ts#add_group_internal_name_and_object_guid migration.sql (D-04) |
pass |
|
| kind |
ref |
status |
| other |
docker exec tessera-ctl-db-1 psql -U tessera -d tessera -c '\d "Group"' — zeigt internalName, ldapObjectGuid, Group_tenantId_ldapObjectGuid_key |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D2 |
LdapService.listGroups()/importGroupsByDn() — Discovery mit alreadyImported-Flag und stabiler Sortierung, Import mit Duplikat-/Namenskollisions-Behandlung, Buffer-basiertem objectGUID-Handling (SC-1, SC-2, D-01, D-02) |
PERM-02 |
| kind |
ref |
status |
| unit |
apps/api/src/ldap/ldap.service.spec.ts#LdapService — AD group import (SC-1/SC-2, D-01/D-02) (8 it-Fälle) |
pass |
|
|
false |
|
| id |
description |
requirement |
verification |
human_judgment |
| D3 |
POST /ldap/groups/import Route hinter @Roles(ADMIN, SUPER_ADMIN), tenantId ausschließlich aus req.tenantId, ImportGroupsDto lehnt leeres dns-Array ab |
PERM-02 |
| kind |
ref |
status |
| unit |
apps/api/src/ldap/ldap.service.spec.ts (Controller-Verhalten indirekt über Service-Vertrag) + acceptance-criteria grep auf ldap.controller.ts |
pass |
|
|
false |
|
| id |
description |
verification |
human_judgment |
rationale |
| D4 |
Sektion 'AD-Gruppen importieren' in /admin/ldap — Auswahl, Import-Button mit Auswahlzahl, alreadyImported-Badge, sichtbare Fehlerzustände statt stillem Verschlucken |
| kind |
ref |
status |
| unit |
cd apps/web && npx tsc --noEmit (typkorrekt) + acceptance-criteria grep auf handleDiscoverGroupsToImport/handleImportGroups (setGroupImportError >= 4x) |
pass |
|
|
true |
Visuelle Interaktion (Checkbox-Zustände, Badge-Styling, Fehlerbanner) wurde im Rahmen des Post-Tracer-Checkpoints per Code-Review als 'verified' bestätigt, aber nicht gegen einen live gerenderten Browser erneut geprüft — echte UAT bleibt sinnvoll, bevor Plan 16-02 darauf aufbaut. |
|
|
34min |
2026-08-06 |
complete |