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:
@@ -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_
|
||||
Reference in New Issue
Block a user