diff --git a/prisma/migrations/20250726074332_add_email_config/migration.sql b/prisma/migrations/20250726074332_add_email_config/migration.sql new file mode 100644 index 0000000..2c0f44c --- /dev/null +++ b/prisma/migrations/20250726074332_add_email_config/migration.sql @@ -0,0 +1,16 @@ +-- CreateTable +CREATE TABLE "email_config" ( + "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT DEFAULT 1, + "subject" TEXT NOT NULL DEFAULT 'Praktikumsplatz-Zusage', + "template" TEXT NOT NULL DEFAULT 'Sehr geehrte/r {anrede} {nachname}, + +wir freuen uns, Ihnen mitteilen zu können, dass Ihre Bewerbung für ein Praktikum erfolgreich war. + +Sie wurden für das Praktikum bei folgender Dienststelle angenommen: +{dienststelle} + +Weitere Informationen erhalten Sie in den kommenden Tagen. + +Mit freundlichen Grüßen +Ihr Praktikumsteam' +); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index bf5845e..23a0deb 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -14,6 +14,14 @@ model Admin { password String } +model EmailConfig { + id Int @id @default(1) + subject String @default("Praktikumsplatz-Zusage") + template String @default("Sehr geehrte/r {anrede} {nachname},\n\nwir freuen uns, Ihnen mitteilen zu können, dass Ihre Bewerbung für ein Praktikum erfolgreich war.\n\nSie wurden für das Praktikum bei folgender Dienststelle angenommen:\n{dienststelle}\n\nWeitere Informationen erhalten Sie in den kommenden Tagen.\n\nMit freundlichen Grüßen\nIhr Praktikumsteam") + + @@map("email_config") +} + model Dienststelle { id Int @id @default(autoincrement()) name String @unique diff --git a/src/routes/admin/anmeldungen/+page.svelte b/src/routes/admin/anmeldungen/+page.svelte index 1ee3c61..20c7035 100644 --- a/src/routes/admin/anmeldungen/+page.svelte +++ b/src/routes/admin/anmeldungen/+page.svelte @@ -22,6 +22,11 @@ id: number; } + interface EmailConfig { + subject: string; + template: string; + } + let anmeldungen: Anmeldung[] = []; let isLoading = true; let error = ''; @@ -47,6 +52,8 @@ Mit freundlichen Grüßen Ihr Praktikumsteam`; let showEmailConfig = false; + let isLoadingEmailConfig = false; + let isSavingEmailConfig = false; async function loadAnmeldungen() { try { @@ -68,6 +75,54 @@ Ihr Praktikumsteam`; } } + async function loadEmailConfig() { + try { + isLoadingEmailConfig = true; + + const res = await fetch('/api/admin/email-config'); + + if (!res.ok) { + throw new Error(`Fehler beim Laden der E-Mail-Konfiguration: ${res.status}`); + } + + const config: EmailConfig = await res.json(); + emailSubject = config.subject; + emailTemplate = config.template; + } catch (err) { + console.error('Fehler beim Laden der E-Mail-Konfiguration:', err); + // Fallback auf Standard-Werte bei Fehler + } finally { + isLoadingEmailConfig = false; + } + } + + async function saveEmailTemplate() { + try { + isSavingEmailConfig = true; + + const res = await fetch('/api/admin/email-config', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + subject: emailSubject, + template: emailTemplate + }) + }); + + if (!res.ok) { + throw new Error(`Fehler beim Speichern: ${res.status}`); + } + + showEmailConfig = false; + alert('E-Mail-Vorlage erfolgreich gespeichert!'); + } catch (err) { + error = err instanceof Error ? err.message : 'Fehler beim Speichern der E-Mail-Vorlage'; + console.error(err); + } finally { + isSavingEmailConfig = false; + } + } + function handleAccept(event: CustomEvent<{id: number}>) { const anmeldung = anmeldungen.find(a => a.id === event.detail.id); if (!anmeldung) return; @@ -178,26 +233,9 @@ Ihr Praktikumsteam`; selectedAnmeldungId = null; } - function saveEmailTemplate() { - // Hier könnten Sie die E-Mail-Vorlage in localStorage oder auf dem Server speichern - localStorage.setItem('emailSubject', emailSubject); - localStorage.setItem('emailTemplate', emailTemplate); - showEmailConfig = false; - alert('E-Mail-Vorlage gespeichert!'); - } - - function loadEmailTemplate() { - // E-Mail-Vorlage aus localStorage laden - const savedSubject = localStorage.getItem('emailSubject'); - const savedTemplate = localStorage.getItem('emailTemplate'); - - if (savedSubject) emailSubject = savedSubject; - if (savedTemplate) emailTemplate = savedTemplate; - } - onMount(() => { loadAnmeldungen(); - loadEmailTemplate(); + loadEmailConfig(); }); @@ -217,10 +255,15 @@ Ihr Praktikumsteam`; @@ -240,6 +283,7 @@ Ihr Praktikumsteam`; type="text" bind:value={emailSubject} class="w-full border border-gray-300 rounded-md px-3 py-2 focus:ring-blue-500 focus:border-blue-500" + disabled={isSavingEmailConfig} /> @@ -252,6 +296,7 @@ Ihr Praktikumsteam`; bind:value={emailTemplate} rows="10" class="w-full border border-gray-300 rounded-md px-3 py-2 focus:ring-blue-500 focus:border-blue-500" + disabled={isSavingEmailConfig} >
Verfügbare Platzhalter: {anrede}, {vorname}, {nachname}, {dienststelle} @@ -262,14 +307,21 @@ Ihr Praktikumsteam`; diff --git a/src/routes/api/admin/email-config/+server.ts b/src/routes/api/admin/email-config/+server.ts new file mode 100644 index 0000000..167c8ad --- /dev/null +++ b/src/routes/api/admin/email-config/+server.ts @@ -0,0 +1,76 @@ +// src/routes/api/admin/email-config/+server.ts +import { json, error } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +export const GET: RequestHandler = async () => { + try { + // E-Mail-Konfiguration aus der Datenbank laden + let emailConfig = await prisma.emailConfig.findUnique({ + where: { id: 1 } + }); + + // Wenn keine Konfiguration existiert, Standard-Konfiguration erstellen + if (!emailConfig) { + emailConfig = await prisma.emailConfig.create({ + data: { + id: 1, + subject: 'Praktikumsplatz-Zusage', + template: `Sehr geehrte/r {anrede} {nachname}, + +wir freuen uns, Ihnen mitteilen zu können, dass Ihre Bewerbung für ein Praktikum erfolgreich war. + +Sie wurden für das Praktikum bei folgender Dienststelle angenommen: +{dienststelle} + +Weitere Informationen erhalten Sie in den kommenden Tagen. + +Mit freundlichen Grüßen +Ihr Praktikumsteam` + } + }); + } + + return json({ + subject: emailConfig.subject, + template: emailConfig.template + }); + } catch (err) { + console.error('Fehler beim Laden der E-Mail-Konfiguration:', err); + return error(500, 'Fehler beim Laden der E-Mail-Konfiguration'); + } +}; + +export const POST: RequestHandler = async ({ request }) => { + try { + const { subject, template } = await request.json(); + + if (!subject || !template) { + return error(400, 'Subject und Template sind erforderlich'); + } + + // E-Mail-Konfiguration aktualisieren oder erstellen + const emailConfig = await prisma.emailConfig.upsert({ + where: { id: 1 }, + update: { + subject, + template + }, + create: { + id: 1, + subject, + template + } + }); + + return json({ + subject: emailConfig.subject, + template: emailConfig.template + }); + } catch (err) { + console.error('Fehler beim Speichern der E-Mail-Konfiguration:', err); + return error(500, 'Fehler beim Speichern der E-Mail-Konfiguration'); + } +}; \ No newline at end of file