e46b68b63f
- imap/store.go: DeleteByOwner() – löscht alle IMAP-Konten eines Nutzers - api/server.go: handleDeleteUser lädt Nutzername vor Löschung, ruft DeleteByOwner, schreibt erweitertes Audit-Log (username, role, IMAP-Count, GoBD-Hinweis) - admin/page.tsx: confirm() ersetzt durch Dialog mit GoBD-Hinweis, Deaktivieren-Option (empfohlen) und endgültigem Löschen (destruktiv) - features/PROJ-20-nutzer-loeschung.md: Feature-Spec angelegt - features/INDEX.md: PROJ-20 eingetragen, Next ID → PROJ-21 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2.5 KiB
2.5 KiB
id, title, status, created
| id | title | status | created |
|---|---|---|---|
| PROJ-20 | Nutzer-Löschung & E-Mail-Verbleib (GoBD-konform) | Deployed | 2026-03-17 |
Ziel
Definiert und implementiert das Verhalten beim Löschen eines Benutzerkontos in Bezug auf archivierte E-Mails, IMAP-Verbindungen und Compliance-Anforderungen.
Hintergrund
E-Mails im Archiv sind Unternehmenseigentum und nicht an einen Benutzeraccount gebunden. Die GoBD schreibt eine Aufbewahrungspflicht von 6–10 Jahren vor, die auch nach Ausscheiden eines Mitarbeiters gilt. Daher dürfen E-Mails bei einer Konto-Löschung nie automatisch mitgelöscht werden.
Verhalten
E-Mails
- E-Mails haben keinen Fremdschlüssel auf
users— sie sind global im Archiv gespeichert. - Bei jeder Art von Konto-Entfernung bleiben alle E-Mails vollständig erhalten.
- Keine automatische Löschung, kein Cascade.
IMAP-Verbindungen
- Beim endgültigen Löschen eines Nutzers werden alle IMAP-Konten (
imap_accounts WHERE owner = username) mitgelöscht. - Sync-Jobs laufen nicht mehr ins Leere.
Audit-Log
- Jede Löschung wird im Audit-Log erfasst mit:
user_id,username,role, Anzahl gelöschter IMAP-Konten und dem Hinweisemails retained per GoBD.
Zwei Aktionen im Admin-UI
| Aktion | Effekt | Rückgängig |
|---|---|---|
| Deaktivieren (empfohlen) | active = false, Login gesperrt, Konto + IMAP erhalten |
Ja — jederzeit reaktivierbar |
| Endgültig löschen | Account + IMAP-Konten entfernt, E-Mails bleiben | Nein |
Implementierung
Backend (internal/api/server.go)
handleDeleteUser: Lädt Nutzername vor Löschung, ruftimapStore.DeleteByOwner(), schreibt erweitertes Audit-Log.
IMAP Store (internal/imap/store.go)
- Neue Methode:
DeleteByOwner(ctx, username) (int, error)— löscht alle IMAP-Konten eines Nutzers.
Frontend (src/app/admin/page.tsx)
- Löschen-Button öffnet Dialog statt
confirm(). - Dialog zeigt: GoBD-Hinweis, Erklärung beider Optionen, Deaktivieren-Button (primär), Löschen-Button (destruktiv).
- Deaktivieren ruft
PATCH /api/users/{id}mit{ active: false }. - Löschen ruft
DELETE /api/users/{id}.
Akzeptanzkriterien
- Löschen eines Nutzers entfernt keine E-Mails
- Löschen eines Nutzers entfernt dessen IMAP-Konten
- Audit-Log enthält Nutzername, Rolle und IMAP-Anzahl
- Admin-UI zeigt Warn-Dialog mit GoBD-Hinweis
- Deaktivieren als separate, bevorzugte Aktion verfügbar
- Bereits deaktivierte Nutzer: Deaktivieren-Button inaktiv