d360c9a5ba
- 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>
6.3 KiB
6.3 KiB
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