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>
59 lines
2.5 KiB
Markdown
59 lines
2.5 KiB
Markdown
---
|
||
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 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 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
|