Files
archivmail/features/PROJ-20-nutzer-loeschung.md
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

2.5 KiB
Raw Permalink Blame History

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

  • 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