Files
archivmail/features/PROJ-10-admin-bereich.md
T
sysops d360c9a5ba feat(PROJ-17): Admin Dashboard Systemauslastung immer anzeigen
- Systemauslastungs-Sektion wird immer gerendert (nicht nur bei Erfolg)
- Fehlermeldung wenn /api/admin/system/stats nicht erreichbar ist
- Feature-Status auf In Review gesetzt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 11:43:19 +01:00

6.3 KiB
Raw Blame History

PROJ-10: Admin-Bereich: Nutzer- & Postfachverwaltung

Status: In Progress

Created: 2026-03-12 Last Updated: 2026-03-12

Dependencies

  • Requires: PROJ-1 (Authentifizierung & Rollen) nur Admins haben Zugang

User Stories

  • Als Admin möchte ich alle Nutzer auflisten, bearbeiten, deaktivieren und löschen.
  • Als Admin möchte ich Postfächer (IMAP-Verbindungen) verwalten und Nutzern zuweisen.
  • Als Admin möchte ich Systemstatistiken sehen (Gesamtanzahl E-Mails, Speicher, aktive Nutzer).
  • Als Admin möchte ich Import-Konfigurationen (IMAP, SMTP) verwalten.
  • Als Admin möchte ich globale Systemeinstellungen konfigurieren (Sync-Intervall, max. Upload-Größe, Retention-Policy).

Acceptance Criteria

  • Admin-Dashboard mit Übersicht: Nutzeranzahl, E-Mail-Anzahl, Speicherverbrauch
  • Nutzerliste: Anzeige aller Nutzer mit Rolle, Status, letztem Login
  • Nutzer anlegen / bearbeiten / deaktivieren / löschen (mit Bestätigungsdialog)
  • Postfach-Verwaltung: IMAP-Verbindungen anlegen, bearbeiten, testen, löschen
  • Postfach-Zuweisung: Nutzer einem oder mehreren Postfächern zuordnen
  • System-Einstellungen: Sync-Intervall, SMTP-Port, max. Upload-Größe, Retention-Tage
  • Alle Admin-Aktionen werden im Audit-Log erfasst

Edge Cases

  • Admin löscht Nutzer mit archivierten E-Mails → E-Mails bleiben im Archiv, Nutzer wird anonymisiert (DSGVO)
  • Letzten Admin löschen/deaktivieren → verhindern mit Fehlermeldung
  • Postfach löschen mit laufendem Sync → Sync abbrechen, dann löschen

Technical Requirements

  • Admin-Bereich unter eigenem Route-Prefix (/admin/*)
  • Alle Admin-API-Endpunkte prüfen Admin-Rolle
  • Änderungen an Systemeinstellungen erfordern Server-Neustart nur wenn unvermeidlich

Tech Design (Solution Architect)

Komponentenstruktur

Next.js Frontend (/admin/*):

/admin
├── Dashboard                         ← Einstiegsseite
│   ├── StatCard: Gesamtanzahl Mails
│   ├── StatCard: Speicherverbrauch (store + astore)
│   ├── StatCard: Aktive Nutzer
│   ├── StatCard: Letzter SMTP-Eingang
│   └── ImportQueue-Status (laufende Imports)
│
├── /admin/users                      ← Nutzerverwaltung
│   ├── NutzerTabelle (Name, Rolle, Status, letzter Login)
│   ├── [Nutzer anlegen] Button → NutzerFormular
│   └── NutzerRow-Aktionen
│       ├── Bearbeiten (Rolle, Passwort zurücksetzen)
│       ├── Deaktivieren / Aktivieren
│       └── Löschen (Bestätigungsdialog + DSGVO-Hinweis)
│
├── /admin/imap                       ← IMAP-Verbindungen (PROJ-3 + PROJ-8)
│   ├── IMAP-Verbindungsliste
│   └── Postfach-Zuweisung (Nutzer ↔ IMAP-Account)
│
├── /admin/pop3                       ← POP3-Verbindungen (PROJ-14)
│
├── /admin/smtp                       ← SMTP-Daemon-Status (PROJ-4)
│   ├── Status (läuft / gestoppt), Port, TLS
│   ├── Anzahl empfangener Mails (heute / gesamt)
│   └── IP-Allowlist verwalten
│
├── /admin/upload                     ← EML/MBOX Upload (PROJ-2)
│
├── /admin/apikeys                    ← API-Keys (PROJ-13)
│
├── /admin/labels                     ← Globale Labels + Auto-Regeln (PROJ-9)
│
└── /admin/settings                   ← Systemeinstellungen
    ├── max. Upload-Größe (MB)
    ├── Retention-Tage (0 = unbegrenzt)
    ├── Session-Timeout (Stunden)
    └── SMTP-Port (Hinweis: Neustart erforderlich)

Go Backend (/api/admin/*):

Admin-Router (alle Routen prüfen admin-Rolle)
│
├── GET  /api/admin/stats              ← Dashboard-Zahlen
│   (Mail-Count, Speicher, aktive User, letzter SMTP-Eingang)
│
├── Nutzer-Verwaltung
│   ├── GET    /api/admin/users
│   ├── POST   /api/admin/users        ← anlegen
│   ├── PATCH  /api/admin/users/{id}   ← bearbeiten
│   ├── DELETE /api/admin/users/{id}   ← löschen (DSGVO-Anonymisierung)
│   └── POST   /api/admin/users/{id}/reset-password
│
├── Postfach-Zuweisung
│   ├── GET  /api/admin/users/{id}/mailboxes
│   ├── POST /api/admin/users/{id}/mailboxes/{account_id}
│   └── DELETE /api/admin/users/{id}/mailboxes/{account_id}
│
└── Systemeinstellungen
    ├── GET   /api/admin/settings
    └── PATCH /api/admin/settings

DSGVO-Löschfluss (Nutzer löschen)

Admin klickt "Nutzer löschen"
        │
        ▼
Bestätigungsdialog:
"E-Mails bleiben im Archiv.
 Nutzerdaten werden anonymisiert."
        │
        ▼
DELETE /api/admin/users/{id}
        │
        ├── Ist letzter Admin? → 409 Conflict (verhindern)
        │
        ├── E-Mails des Nutzers → bleiben im Archiv (immutable)
        │
        ├── Audit-Log-Einträge → user_id → "anonymized"
        │                         IP-Adressen → gelöscht
        ├── Sessions → alle gelöscht
        ├── Labels des Nutzers → gelöscht
        └── User-Eintrag → gelöscht

Datenmodell

Tabelle settings Key-Value-Store für Systemeinstellungen:

Key Standardwert Beschreibung
max_upload_mb 500 Max. Upload-Größe in MB
retention_days 0 0 = unbegrenzt
session_timeout_hours 8 Session-Inaktivitäts-Timeout
smtp_port 2525 SMTP-Daemon-Port (Neustart nötig)

Technische Entscheidungen

Entscheidung Begründung
Admin-Bereich als eigene Next.js-Route Klare Trennung von User-Frontend RoleGuard blockiert Nicht-Admins sofort
Dashboard-Stats vom Backend Mail-Count, Speicher aus DB/Dateisystem kein Client-seitiges Berechnen
Settings als DB-Key-Value Einstellungen zur Laufzeit änderbar ohne Dateisystem-Zugriff oder Neustart (außer SMTP-Port)
DSGVO-Anonymisierung statt Hard-Delete Archiv-Integrität bleibt erhalten E-Mails im Archiv haben keinen Personenbezug mehr nach Anonymisierung
Letzter-Admin-Schutz Verhindert Aussperrung Backend prüft vor jedem Delete/Deaktivieren

Abhängigkeiten

Next.js: shadcn/ui Table, Dialog, Form (bereits installiert). Go Backend: Nur pgx + Stdlib (bereits vorhanden).

QA Test Results

To be added by /qa

Deployment

To be added by /deploy