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

162 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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_