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>
This commit is contained in:
sysops
2026-03-14 11:43:19 +01:00
parent a893084a88
commit d360c9a5ba
68 changed files with 11938 additions and 435 deletions
+161
View File
@@ -0,0 +1,161 @@
# 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_