Files
archivmail/features/PROJ-20-nutzer-loeschung.md
T
sysops e46b68b63f feat(PROJ-20): GoBD-konforme Nutzer-Löschung mit IMAP-Cleanup und Warn-Dialog
- 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>
2026-03-17 13:44:32 +01:00

59 lines
2.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: PROJ-20
title: Nutzer-Löschung & E-Mail-Verbleib (GoBD-konform)
status: Deployed
created: 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 610 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 Hinweis `emails 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, ruft `imapStore.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
- [x] Löschen eines Nutzers entfernt keine E-Mails
- [x] Löschen eines Nutzers entfernt dessen IMAP-Konten
- [x] Audit-Log enthält Nutzername, Rolle und IMAP-Anzahl
- [x] Admin-UI zeigt Warn-Dialog mit GoBD-Hinweis
- [x] Deaktivieren als separate, bevorzugte Aktion verfügbar
- [x] Bereits deaktivierte Nutzer: Deaktivieren-Button inaktiv