fix(stressfrei): sync-forwarding sichtbar + Passwort-Push + Toast-Meldungen

Drei Verbesserungen am gestrigen Sync-Feature:

1. Bug-Fix: isProvisioned wurde nie auf true gesetzt
   `createEmail` mit `provisionAtProvider: true` hat das Flag
   `isProvisioned` nie gesetzt → blieb auf @default(false). Damit
   blieb der Refresh-Button in der UI unsichtbar (Bedingung
   `emailItem.isProvisioned`). Jetzt:
   - createEmail setzt isProvisioned + provisionedAt korrekt
   - Self-Healing: syncForwardingForEmail setzt das Flag nachträglich
     auf true sobald der Provider-Aufruf erfolgreich war (Backfill
     für historisch falsch markierte Einträge)
   - UI-Sichtbarkeit: Bedingung entfernt – der Button erscheint jetzt
     immer; ein Klick auf eine nicht-provisionierte Adresse liefert
     eine sprechende Fehlermeldung statt stiller Verstecken

2. Passwort-Push bei hasMailbox: true
   Bisher wurden nur die Forwards aktualisiert. Jetzt entschlüsselt
   syncForwardingForEmail bei Mailbox-Adressen zusätzlich das im CRM
   gespeicherte Passwort und setzt es am Provider neu – Self-Healing
   für IMAP/SMTP-Logins falls jemand im Plesk-UI manuell ein anderes
   Passwort gesetzt hat. Response enthält `passwordReset: true` als
   Marker.

3. react-hot-toast statt alert()
   Erfolgs-Toast listet die neu gesetzten Forward-Targets + Hinweis
   ob Passwort-Reset durchgeführt wurde. Fehler-Toast zeigt die
   Backend-Fehlermeldung (z.B. „E-Mail-Adresse beim Provider nicht
   gefunden – wurde sie dort gelöscht?").

Audit-Log-Label enthält jetzt sowohl Forwards als auch Passwort-Reset-
Marker, damit der Vorgang im AuditLog nachvollziehbar bleibt.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-16 14:06:26 +02:00
parent b4be3cebfb
commit c2ebc7cf1e
5 changed files with 156 additions and 53 deletions
+21 -8
View File
@@ -97,16 +97,29 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
## ✅ Erledigt
- [x] **🔁 Stressfrei-Adressen: Weiterleitungen manuell synchronisieren**
- Refresh-Icon-Button in der Action-Reihe jeder provisionierten
Stressfrei-Adresse (Tooltip erklärt: „ersetzt die Forwards am Provider
durch Kunden-Stamm-E-Mail + Service-Adresse"). Use-Case: nach
Änderung der Stamm-E-Mail eines Kunden, oder nach Wechsel der
- [x] **🔁 Stressfrei-Adressen: Weiterleitungen + Passwort manuell synchronisieren**
- Refresh-Icon-Button in der Action-Reihe jeder Stressfrei-Adresse
(Tooltip erklärt: „ersetzt die Forwards am Provider durch
Kunden-Stamm-E-Mail + Service-Adresse"). Use-Case: nach Änderung der
Stamm-E-Mail eines Kunden, oder nach Wechsel der
`defaultForwardEmail` in den Provider-Settings.
- Backend nutzt das bestehende Plesk `updateForwardTargets`
(`set:email1,email2` → ersetzt komplett, idempotent).
- **Bei `hasMailbox: true`** wird zusätzlich das im CRM verschlüsselt
hinterlegte Mailbox-Passwort am Provider neu gesetzt. Self-Healing
für den Fall, dass jemand im Plesk-UI manuell ein anderes Passwort
gesetzt hat und IMAP/SMTP im CRM nicht mehr passt.
- Backend nutzt Plesk's `updateForwardTargets` (`set:email1,email2`
→ ersetzt komplett, idempotent) + bei Mailbox auch
`updateMailboxPassword` (Plesk-Passwort-Update).
- Endpoint: `POST /api/stressfrei-emails/:id/sync-forwarding`,
`customers:update`-Permission, Audit-Log mit Forward-Targets.
`customers:update`-Permission, Audit-Log mit Forward-Targets +
Passwort-Reset-Marker.
- Self-Healing: `isProvisioned`-Flag wird bei erfolgreichem
Provider-Aufruf automatisch auf `true` korrigiert (historischer Bug:
Flag wurde beim `createEmail` mit `provisionAtProvider: true` nie
gesetzt jetzt behoben + Backfill via Sync).
- Erfolgs-/Fehler-Meldungen via `react-hot-toast` (statt `alert()`)
mit Liste der gesetzten Forward-Targets + Hinweis ob Passwort-Reset
durchgeführt wurde.
- In der Kundenakte (Stammdaten → Kontakt → E-Mail) externes
Link-Icon, das in neuem Tab direkt den Stressfrei-Tab des Kunden
öffnet sichtbar nur wenn Stressfrei-Adressen vorhanden sind.