Bisher war vorgaengerId eindeutig: nach einer abgebrochenen Rotation passte kein zweiter Nachfolger in die Kette, und der Schlüssel ließ sich nur über Neuanlage, Zuweisen und Widerruf ersetzen. Jetzt ist die Relation 1:n. Ein partieller Index erlaubt je Vorgänger nur einen Nachfolger, der weder widerrufen ist noch gerade widerrufen wird. Maßgeblich ist der jüngste. Erst wenn der Abbruch abgeschlossen ist, beginnt die Rotation wieder bei Schritt 1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
28 lines
1.5 KiB
Markdown
28 lines
1.5 KiB
Markdown
# #033 Erneut rotieren nach abgebrochener Rotation
|
|
**Status:** erledigt
|
|
**Meilenstein:** v1.0.0
|
|
**Labels:** backend, datenbank
|
|
**Geschätzt:** 1 h **Tatsächlich:** 0,5 h
|
|
|
|
## Ziel
|
|
Nach einer abgebrochenen Rotation (#032) lässt sich derselbe Schlüssel erneut rotieren, statt dass ein neuer Schlüssel angelegt, zugewiesen und der alte widerrufen werden muss.
|
|
|
|
## Aufgaben
|
|
- [x] `vorgaengerId` nicht mehr eindeutig; stattdessen partieller Index: je Vorgänger höchstens ein Nachfolger, der weder widerrufen ist noch gerade widerrufen wird
|
|
- [x] Relation 1:n (`nachfolgerListe`); maßgeblich ist der jüngste Nachfolger (`JUENGSTER`, `mitNachfolger`)
|
|
- [x] Neue Rotation erst, wenn der Abbruch abgeschlossen ist (Nachfolger WIDERRUFEN)
|
|
- [x] Schlüsselseite: „Rotieren“ wieder anbieten, Hinweistext angepasst
|
|
|
|
## Akzeptanzkriterien
|
|
- [x] DB-Test: Abbruch → während des Abbruchs keine neue Rotation → danach zweiter Nachfolger, Kette zeigt ihn
|
|
- [x] DB-Test: die Datenbank lehnt einen zweiten offenen Nachfolger ab
|
|
- [x] E2E: nach dem Abbruch führt „Rotieren“ wieder zu Schritt 1
|
|
|
|
## Abhängigkeiten
|
|
#023, #032
|
|
|
|
## Notizen / Entscheidungen
|
|
- **Abgebrochene Nachfolger bleiben** mit `vorgaengerId` in der Historie; die Rotationskette folgt dem jüngsten Nachfolger.
|
|
- **Kein neuer Rotations-Zustand:** Ist der jüngste Nachfolger vollständig widerrufen und der alte nicht ROTIERT, steht die Rotation wieder bei Schritt 0.
|
|
- Prisma kennt partielle Indizes nicht; `migrate diff` bleibt trotzdem leer, weil der Index nur in der Migration steht (wie beim Instanz-Standard).
|