Admin kann Nutzer inaktiv schalten (kein Login mehr, Daten bleiben vollstaendig erhalten) und wieder aktivieren #221
Labels
No labels
priority/could
priority/must
priority/should
priority/wont
status/blocked
status/claimed
status/done-migrated
type/bug
type/feature
type/infra
type/tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
robert/todo#221
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Story: Nutzer voruebergehend deaktivieren statt loeschen
As a Admin,
I want to einen Nutzer in der Nutzeruebersicht auf "inaktiv" schalten und spaeter wieder auf "aktiv" zuruecksetzen koennen,
so that ich einem Nutzer den Zugang sperren kann, als waere sein Konto geloescht - ohne dass dabei irgendwelche Daten verloren gehen, falls er spaeter wieder Zugang bekommen soll.
Wortlaut des Nutzers: "Ich moechte als Admin in der Lage sein, einen User als "inaktiv" zu schalten, d.h. der User kann sich nicht mehr einloggen / es ist, als waere sein account geloescht. Man kann ihn aber wieder "aktiv" schalten und seine Daten sind vollstaendig erhalten."
Hintergrund: Die Admin-Nutzeruebersicht mit endgueltiger Loeschung gibt es seit #206, das Zuruecksetzen des Passworts durch den Admin seit #210. Fuer das sofortige Abmelden auf allen Geraeten gibt es bereits einen Mechanismus (
SessionsRevokedBeforeUtc, wird von #210 genutzt) - der soll hier wiederverwendet werden.Acceptance criteria:
Out of scope for this story:
Open questions: (escalate to human if unanswered)
Als Backlog-Item vom Nutzer eingereicht (per Chat, nicht im laufenden Loop-Zyklus geclaimt).
Claimed by the autonomous loop (go-cycle 2026-09-29). Design first; the open question about what other members see, plus a few further scope decisions, will be asked to the human up front before implementation starts.
Decisions by the human (2026-09-29, asked up front):
Done, pushed to master (f5ec8abb..e61bd1db).
Scope
DeactivatedAtUtc(migrationAddDeactivatedAtToUser); nothing else about the user is touched, so reactivation restores everything.Tests: backend 1087 + 63 + 119 green (new: SetUserActiveAsAdminCommandHandlerTests incl. data-preservation round trip, plus login/session/API key/forgot/reset/email/push/assignment/transfer/rotation/member/overview cases); frontend 149 files / 1495 tests green (admin deactivate/reactivate/cancel/filter, pickers, members hint, assignee badge, transfer dialog).
Known gap (pre-existing, shared with #59/#210): an already-open live-update WebSocket isn't closed by session revocation; a passive open tab keeps receiving list updates until its next request/reconnect. Documented in docs/SECURITY_NOTES.md, suggested as follow-up.
Deliberate: deleting a deactivated account still sends the GDPR deletion confirmation mail.