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
@@ -80,7 +80,24 @@ export interface CreateProviderConfigData {
isDefault?: boolean;
}
// Validiert Domain-Format (z.B. stressfrei-wechseln.de, mail.beispiel.com)
const DOMAIN_REGEX = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/;
function validateDomain(domain: string | undefined): string {
if (!domain || !domain.trim()) {
throw new Error('Domain ist erforderlich');
}
const normalized = domain.trim().toLowerCase();
if (!DOMAIN_REGEX.test(normalized)) {
throw new Error(`Ungültige Domain: "${domain}". Format: name.tld (z.B. meine-firma.de)`);
}
return normalized;
}
export async function createProviderConfig(data: CreateProviderConfigData) {
// Domain validieren
const validatedDomain = validateDomain(data.domain);
// Falls isDefault=true, alle anderen auf false setzen
if (data.isDefault) {
await prisma.emailProviderConfig.updateMany({
@@ -102,7 +119,7 @@ export async function createProviderConfig(data: CreateProviderConfigData) {
apiKey: data.apiKey || null,
username: data.username || null,
passwordEncrypted,
domain: data.domain,
domain: validatedDomain,
defaultForwardEmail: data.defaultForwardEmail || null,
imapEncryption: data.imapEncryption ?? 'SSL',
smtpEncryption: data.smtpEncryption ?? 'SSL',
@@ -135,7 +152,7 @@ export async function updateProviderConfig(
if (data.apiUrl !== undefined) updateData.apiUrl = data.apiUrl;
if (data.apiKey !== undefined) updateData.apiKey = data.apiKey || null;
if (data.username !== undefined) updateData.username = data.username || null;
if (data.domain !== undefined) updateData.domain = data.domain;
if (data.domain !== undefined) updateData.domain = validateDomain(data.domain);
if (data.defaultForwardEmail !== undefined)
updateData.defaultForwardEmail = data.defaultForwardEmail || null;
if (data.imapEncryption !== undefined) updateData.imapEncryption = data.imapEncryption;