Fix: Provider-Domain greift sofort + Domain-Validierung

Problem: Nach dem Ändern der Provider-Domain blieb die alte Domain
(stressfrei-wechseln.de) im Adress-Hinzufügen-Dialog bestehen, weil der
Frontend-Hook useProviderSettings() einen 5-Minuten staleTime hat und
nicht invalidiert wurde.

Fix:
- In allen Provider-Mutations (create/update/delete) wird jetzt auch
  'email-provider-public-settings' invalidiert → Domain & Label greifen
  sofort in allen Komponenten

Zusätzlich Domain-Validierung eingebaut:
- Frontend: pattern am Input + Live-Fehlermeldung
  Format: name.tld (mit Subdomains erlaubt, z.B. mail.meine-firma.de)
  Input auto-lowercase + trim
- Backend: validateDomain() in createProviderConfig/updateProviderConfig
  Wirft Error mit sprechender Meldung bei ungültigem Format
- Schützt vor Versehen im UI + direkten API-Aufrufen

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-23 15:51:16 +02:00
parent 1290cdad10
commit 92f4d7308d
2 changed files with 43 additions and 9 deletions
+24 -7
View File
@@ -101,6 +101,7 @@ export default function EmailProviders() {
emailProviderApi.createConfig(data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['email-provider-configs'] });
queryClient.invalidateQueries({ queryKey: ['email-provider-public-settings'] });
closeModal();
},
});
@@ -110,6 +111,7 @@ export default function EmailProviders() {
emailProviderApi.updateConfig(id, data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['email-provider-configs'] });
queryClient.invalidateQueries({ queryKey: ['email-provider-public-settings'] });
closeModal();
},
});
@@ -118,6 +120,7 @@ export default function EmailProviders() {
mutationFn: (id: number) => emailProviderApi.deleteConfig(id),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['email-provider-configs'] });
queryClient.invalidateQueries({ queryKey: ['email-provider-public-settings'] });
},
});
@@ -547,13 +550,27 @@ export default function EmailProviders() {
</div>
</div>
<Input
label="Domain *"
value={formData.domain}
onChange={(e) => setFormData({ ...formData, domain: e.target.value })}
placeholder="stressfrei-wechseln.de"
required
/>
<div>
<Input
label="Domain *"
value={formData.domain}
onChange={(e) =>
setFormData({ ...formData, domain: e.target.value.toLowerCase().trim() })
}
placeholder="stressfrei-wechseln.de"
required
pattern="^[a-z0-9]([a-z0-9\-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9\-]*[a-z0-9])?)+$"
title="Gültige Domain erforderlich, z.B. meine-firma.de oder mail.beispiel.com"
/>
{formData.domain &&
!/^[a-z0-9]([a-z0-9\-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9\-]*[a-z0-9])?)+$/.test(
formData.domain,
) && (
<p className="text-xs text-red-600 mt-1">
Keine gültige Domain Format: name.tld (z.B. meine-firma.de)
</p>
)}
</div>
<Input
label="Bezeichnung für Kunden-E-Mails (UI-Label)"