Delete the users row once the operator has moved out of it

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 <noreply@anthropic.com>
feat/mailboxes
nexxo 2026-07-27 20:44:56 +02:00
parent ce970a5fac
commit edaceb9597
1 changed files with 15 additions and 6 deletions

View File

@ -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