From edaceb9597f5869f49afbbcf2cb5ae0e1820cce7 Mon Sep 17 00:00:00 2001 From: nexxo Date: Mon, 27 Jul 2026 20:44:56 +0200 Subject: [PATCH] Delete the users row once the operator has moved out of it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Decided: whoever is in operators has no business in users. A row left behind is the same mixing the separation exists to end, only smaller. The one case that deletes nothing is a row with a customer, a seat or an order on it. That would mean the same person is operator and paying customer, and a silent delete would take billing data with it — so the migration stops and names the address instead. Neither existing account is in that state. Co-Authored-By: Claude Opus 5 --- .../2026-07-27-operator-identity-design.md | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/docs/superpowers/specs/2026-07-27-operator-identity-design.md b/docs/superpowers/specs/2026-07-27-operator-identity-design.md index a100897..0263b7e 100644 --- a/docs/superpowers/specs/2026-07-27-operator-identity-design.md +++ b/docs/superpowers/specs/2026-07-27-operator-identity-design.md @@ -195,12 +195,21 @@ eingebaut, und **protokollierbar** — wer wann wen angesehen hat. - Die Migration **übernimmt** jedes Konto mit Operator-Rolle nach `operators`, samt Passwort-Hash und 2FA-Feldern. Dieselben Zugangsdaten wie bisher — kein Passwortwechsel, kein Aussperren beim Live-Update. -- Danach wird die `users`-Zeile **nur dann** gelöscht, wenn kein Kunde, keine - Plätze und keine Bestellungen daran hängen. Andernfalls bleibt sie stehen, - verliert aber ihre Rollen, und die Migration **meldet**, was sie stehen ließ. -- Rückweg: die Migration ist `down()`-fähig, solange die `users`-Zeilen noch da - sind. Nach dem Löschen verwaister Zeilen ist nur noch der Weg über - `clupilot:create-operator` offen — das steht in der Migration als Kommentar. +- **Die `users`-Zeile wird danach gelöscht.** Wer in `operators` steht, hat in + `users` nichts mehr verloren — das ist der Sinn der Trennung, und eine + zurückgelassene Zeile wäre genau die Vermischung in klein. Entschieden am + 2026-07-27. +- **Eine Ausnahme, und sie löscht nichts:** hängt an der Zeile ein Kunde, ein + Platz oder eine Bestellung, **bricht die Migration ab** und nennt die + betroffene Adresse. Dieser Zustand hieße, dass dieselbe Person Betreiber *und* + zahlender Kunde ist — dann ist nicht die Zeile das Problem, sondern die + Annahme, und ein stilles `delete` nähme Abrechnungsdaten mit. Geprüft: **keines + der beiden Bestandskonten ist in diesem Zustand**, der Abbruch tritt heute + also nicht ein. +- Rückweg: `down()` legt die `users`-Zeilen aus `operators` wieder an — Hash und + 2FA sind ja übernommen, nicht übersetzt. Verloren geht dabei nur, was seit dem + Umzug am Operator entstanden ist (`last_login_at`). Steht als Kommentar in der + Migration. ### Kleine Punkte, im selben Zug