import type { CollectionAfterChangeHook } from 'payload' import { sendTenantEmail } from '../lib/email/tenant-email-service' interface SubmissionData { field: string value: string } interface FormEmail { emailTo?: string | null cc?: string | null bcc?: string | null replyTo?: string | null emailFrom?: string | null subject?: string | null message?: string | null } interface FormDocument { id: number | string title: string emails?: FormEmail[] tenant?: { id: number | string } | number | string } /** * Hook: Sendet E-Mail-Benachrichtigungen bei neuen Formular-Einsendungen. * Verwendet den Tenant-spezifischen E-Mail-Service. */ export const sendFormNotification: CollectionAfterChangeHook = async ({ doc, req, operation, }) => { // Nur bei neuen Einsendungen if (operation !== 'create') return doc const { payload } = req try { // Form laden mit Details const form = (await payload.findByID({ collection: 'forms', id: doc.form, depth: 1, })) as FormDocument | null if (!form) { console.warn('[Forms] Form not found for submission:', doc.form) return doc } // Prüfen ob E-Mail-Benachrichtigungen konfiguriert sind if (!form.emails || form.emails.length === 0) { return doc } // Tenant ermitteln const tenantId = typeof form.tenant === 'object' ? form.tenant?.id : form.tenant if (!tenantId) { console.warn('[Forms] No tenant found for form submission, skipping email') return doc } // Daten formatieren const submissionData = doc.submissionData as SubmissionData[] | undefined const dataHtml = submissionData ? submissionData .map( (item) => `${item.field}${item.value || '-'}`, ) .join('') : 'Keine Daten' const dataText = submissionData ? submissionData.map((item) => `${item.field}: ${item.value || '-'}`).join('\n') : 'Keine Daten' // E-Mails senden für jede konfigurierte E-Mail-Adresse for (const emailConfig of form.emails) { if (!emailConfig.emailTo) continue const subject = emailConfig.subject || `Neue Formular-Einsendung: ${form.title}` await sendTenantEmail(payload, tenantId, { to: emailConfig.emailTo, subject, replyTo: emailConfig.replyTo || undefined, source: 'form', metadata: { formId: form.id, formTitle: form.title, submissionId: doc.id, }, html: `

Neue Einsendung über "${form.title}"

${emailConfig.message ? `

${emailConfig.message}

` : ''} ${dataHtml}
Feld Wert

Gesendet am ${new Date().toLocaleString('de-DE')}

`, text: `Neue Einsendung über "${form.title}"\n\n${emailConfig.message || ''}\n\n${dataText}\n\nGesendet am ${new Date().toLocaleString('de-DE')}`, }) console.log(`[Forms] Notification sent to ${emailConfig.emailTo} for form ${form.title}`) } } catch (error) { console.error('[Forms] Error sending notification:', error) // Fehler nicht weiterwerfen, damit die Einsendung trotzdem gespeichert wird } return doc }