E-Mail config in die DB

This commit is contained in:
titver968
2025-07-26 09:47:46 +02:00
parent f1eeac6934
commit 62a46fb0de
4 changed files with 175 additions and 23 deletions

View File

@@ -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'
);

View File

@@ -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

View File

@@ -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();
});
</script>
@@ -217,10 +255,15 @@ Ihr Praktikumsteam`;
<button
on:click={() => showEmailConfig = !showEmailConfig}
class="bg-gray-600 hover:bg-gray-700 text-white px-4 py-2 rounded-md text-sm font-medium inline-flex items-center"
disabled={isLoadingEmailConfig}
>
<svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
</svg>
{#if isLoadingEmailConfig}
<div class="animate-spin rounded-full h-4 w-4 border-b-2 border-white mr-2"></div>
{:else}
<svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
</svg>
{/if}
E-Mail-Vorlage konfigurieren
</button>
</div>
@@ -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}
/>
</div>
@@ -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}
></textarea>
<p class="mt-2 text-sm text-gray-500">
Verfügbare Platzhalter: &#123;anrede&#125;, &#123;vorname&#125;, &#123;nachname&#125;, &#123;dienststelle&#125;
@@ -262,14 +307,21 @@ Ihr Praktikumsteam`;
<button
on:click={() => showEmailConfig = false}
class="px-4 py-2 text-sm text-gray-600 hover:text-gray-800"
disabled={isSavingEmailConfig}
>
Abbrechen
</button>
<button
on:click={saveEmailTemplate}
class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md text-sm font-medium"
class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md text-sm font-medium inline-flex items-center"
disabled={isSavingEmailConfig}
>
Speichern
{#if isSavingEmailConfig}
<div class="animate-spin rounded-full h-4 w-4 border-b-2 border-white mr-2"></div>
Speichere...
{:else}
Speichern
{/if}
</button>
</div>
</div>

View File

@@ -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');
}
};