# 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_