From 51eb12b414946eefe21f8b1984b03e10807bb8f1 Mon Sep 17 00:00:00 2001 From: duffyduck Date: Sat, 16 May 2026 14:11:47 +0200 Subject: [PATCH] fix(stressfrei): Refresh-Button nur bei provisioned + Auto-Heilung im Status-Sync MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User-Feedback: der Refresh-Button war auch bei nicht-provisionierten Adressen sichtbar (die nur als DB-Eintrag ohne Plesk-Pendant existieren). Klick darauf gab korrekt einen Fehler, war aber unschön. Bedingung wieder auf `emailItem.isProvisioned` einschränken. Für historische Einträge, bei denen das Flag wegen des alten Bugs nie gesetzt wurde, gibt es jetzt einen automatischen Reconcile-Pfad: `syncMailboxStatus` (wird beim Öffnen jedes Edit-Modals aufgerufen) prüft nicht mehr nur `hasMailbox`, sondern auch `isProvisioned`: - Provider antwortet "existiert" + DB sagt isProvisioned=false → DB-Flag auf true ziehen + provisionedAt setzen - Provider antwortet "nicht da" + DB sagt isProvisioned=true → DB-Flag auf false (Adresse wurde im Plesk-UI manuell gelöscht) - hasMailbox wird zusätzlich konsistent gehalten Damit heilen sich falsch markierte Adressen automatisch, sobald der User sie einmal aufmacht zum Bearbeiten – der Refresh-Button erscheint dann beim Re-Open. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../src/services/stressfreiEmail.service.ts | 39 +++++++++--- .../src/pages/customers/CustomerDetail.tsx | 62 ++++++++++--------- 2 files changed, 63 insertions(+), 38 deletions(-) diff --git a/backend/src/services/stressfreiEmail.service.ts b/backend/src/services/stressfreiEmail.service.ts index 39d49af0..f9c6ec7d 100644 --- a/backend/src/services/stressfreiEmail.service.ts +++ b/backend/src/services/stressfreiEmail.service.ts @@ -210,7 +210,7 @@ export async function syncMailboxStatus(id: number): Promise<{ }> { const stressfreiEmail = await prisma.stressfreiEmail.findUnique({ where: { id }, - select: { email: true, hasMailbox: true }, + select: { email: true, hasMailbox: true, isProvisioned: true, provisionedAt: true }, }); if (!stressfreiEmail) { @@ -222,19 +222,42 @@ export async function syncMailboxStatus(id: number): Promise<{ // Provider-Status prüfen const providerStatus = await checkEmailExists(localPart); + // Self-Healing für `isProvisioned`: das Flag wurde in einer früheren Code- + // Version beim Provisioning nie gesetzt → DB ist stellenweise inkonsistent + // zum Provider. Wir reconciliieren bei jedem Status-Sync mit. + const updates: Record = {}; + if (!providerStatus.exists) { + // Beim Provider nicht (mehr) vorhanden → DB-Flag entsprechend + if (stressfreiEmail.isProvisioned) { + updates.isProvisioned = false; + } + if (stressfreiEmail.hasMailbox) { + updates.hasMailbox = false; + } + if (Object.keys(updates).length > 0) { + await prisma.stressfreiEmail.update({ where: { id }, data: updates }); + return { success: true, hasMailbox: false, wasUpdated: true }; + } return { success: true, hasMailbox: false, wasUpdated: false }; } - const providerHasMailbox = providerStatus.hasMailbox === true; + // Beim Provider vorhanden → isProvisioned auf true ziehen falls noch nicht + if (!stressfreiEmail.isProvisioned) { + updates.isProvisioned = true; + if (!stressfreiEmail.provisionedAt) { + updates.provisionedAt = new Date(); + } + } - // DB aktualisieren wenn Status abweicht + const providerHasMailbox = providerStatus.hasMailbox === true; if (stressfreiEmail.hasMailbox !== providerHasMailbox) { - await prisma.stressfreiEmail.update({ - where: { id }, - data: { hasMailbox: providerHasMailbox }, - }); - console.log(`Mailbox-Status für ${stressfreiEmail.email} aktualisiert: ${stressfreiEmail.hasMailbox} -> ${providerHasMailbox}`); + updates.hasMailbox = providerHasMailbox; + } + + if (Object.keys(updates).length > 0) { + await prisma.stressfreiEmail.update({ where: { id }, data: updates }); + console.log(`Stressfrei-Status für ${stressfreiEmail.email} reconciled:`, updates); return { success: true, hasMailbox: providerHasMailbox, wasUpdated: true }; } diff --git a/frontend/src/pages/customers/CustomerDetail.tsx b/frontend/src/pages/customers/CustomerDetail.tsx index 0fcd89c4..6ad3ae18 100644 --- a/frontend/src/pages/customers/CustomerDetail.tsx +++ b/frontend/src/pages/customers/CustomerDetail.tsx @@ -3060,38 +3060,40 @@ function StressfreiEmailsTab({ > - + > + + + )} {emailItem.isActive ? (