7c29ee88bd
README.md:
- Vollständige Dokumentation aller implementierten Funktionen
- Konfigurationsreferenz, Installation, Systemd, REST-API-Übersicht
- In-Progress-Features klar gekennzeichnet
PROJ-2 (EML/MBOX Web-Upload):
- POST /api/admin/upload – Multipart-Upload mit Hintergrund-Job
- GET /api/admin/upload/{jobID}/progress – Polling
- Admin-Tab "Import" mit Drag-and-Drop, Fortschrittsbalken, Abschlussbericht
PROJ-19 (Mailpiler Migration):
- archivmail import-piler mit Methoden: pilerexport | direct | auto
- Direct: AES-256-CBC + zlib mit defensiven Fallbacks
- pilerexport: Wrapper um mailpilers Export-Tool
Status-Updates: PROJ-3, PROJ-4, PROJ-6, PROJ-7, PROJ-10, PROJ-11 → Deployed
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
162 lines
6.3 KiB
Markdown
162 lines
6.3 KiB
Markdown
# PROJ-10: Admin-Bereich: Nutzer- & Postfachverwaltung
|
||
|
||
## Status: Deployed
|
||
**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_
|