148 lines
4.2 KiB
TypeScript
148 lines
4.2 KiB
TypeScript
// src/routes/api/admin/zeitraeume/+server.ts
|
|
import { json } from '@sveltejs/kit';
|
|
import type { RequestHandler } from './$types';
|
|
import { prisma } from '$lib/prisma';
|
|
|
|
// Hilfsfunktion: Erstelle ZeitraumPlaetze-Einträge für einen neuen Zeitraum
|
|
async function createZeitraumPlaetzeForZeitraum(zeitraumId: number) {
|
|
const dienststellen = await prisma.dienststelle.findMany();
|
|
|
|
// Erstelle für jede existierende Dienststelle einen Eintrag mit 1 Platz
|
|
for (const dienststelle of dienststellen) {
|
|
await prisma.zeitraumPlaetze.create({
|
|
data: {
|
|
zeitraumId: zeitraumId,
|
|
dienststelleId: dienststelle.id,
|
|
plaetze: 1 // Standardwert: 1 Platz pro Dienststelle
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
export const GET: RequestHandler = async ({ cookies }) => {
|
|
const adminAuth = cookies.get('admin-auth');
|
|
if (adminAuth !== 'authenticated') {
|
|
return json({ error: 'Nicht autorisiert' }, { status: 401 });
|
|
}
|
|
|
|
try {
|
|
const zeitraeume = await prisma.praktikumszeitraum.findMany({
|
|
orderBy: { startDatum: 'desc' }
|
|
});
|
|
return json(zeitraeume);
|
|
} catch (error) {
|
|
console.error('Fehler beim Laden der Zeiträume:', error);
|
|
return json({ error: 'Serverfehler' }, { status: 500 });
|
|
}
|
|
};
|
|
|
|
export const POST: RequestHandler = async ({ request, cookies }) => {
|
|
const adminAuth = cookies.get('admin-auth');
|
|
if (adminAuth !== 'authenticated') {
|
|
return json({ error: 'Nicht autorisiert' }, { status: 401 });
|
|
}
|
|
|
|
try {
|
|
const { bezeichnung, startDatum, endDatum } = await request.json();
|
|
|
|
if (!bezeichnung || !startDatum || !endDatum) {
|
|
return json({ error: 'Alle Felder sind erforderlich' }, { status: 400 });
|
|
}
|
|
|
|
const start = new Date(startDatum);
|
|
const end = new Date(endDatum);
|
|
|
|
if (end <= start) {
|
|
return json({ error: 'Enddatum muss nach dem Startdatum liegen' }, { status: 400 });
|
|
}
|
|
|
|
const zeitraum = await prisma.praktikumszeitraum.create({
|
|
data: {
|
|
bezeichnung,
|
|
startDatum: start,
|
|
endDatum: end
|
|
}
|
|
});
|
|
|
|
// Automatisch ZeitraumPlaetze für alle existierenden Dienststellen erstellen (mit 1 Platz)
|
|
await createZeitraumPlaetzeForZeitraum(zeitraum.id);
|
|
|
|
return json(zeitraum);
|
|
} catch (error: any) {
|
|
console.error('Fehler beim Erstellen des Zeitraums:', error);
|
|
if (error.code === 'P2002') {
|
|
return json(
|
|
{ error: 'Ein Zeitraum mit dieser Bezeichnung existiert bereits' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
return json({ error: 'Serverfehler' }, { status: 500 });
|
|
}
|
|
};
|
|
|
|
export const PATCH: RequestHandler = async ({ request, cookies }) => {
|
|
const adminAuth = cookies.get('admin-auth');
|
|
if (adminAuth !== 'authenticated') {
|
|
return json({ error: 'Nicht autorisiert' }, { status: 401 });
|
|
}
|
|
|
|
try {
|
|
const { id, bezeichnung, startDatum, endDatum } = await request.json();
|
|
|
|
if (!id || !bezeichnung || !startDatum || !endDatum) {
|
|
return json({ error: 'Alle Felder sind erforderlich' }, { status: 400 });
|
|
}
|
|
|
|
const start = new Date(startDatum);
|
|
const end = new Date(endDatum);
|
|
|
|
if (end <= start) {
|
|
return json({ error: 'Enddatum muss nach dem Startdatum liegen' }, { status: 400 });
|
|
}
|
|
|
|
const zeitraum = await prisma.praktikumszeitraum.update({
|
|
where: { id: parseInt(id) },
|
|
data: {
|
|
bezeichnung,
|
|
startDatum: start,
|
|
endDatum: end
|
|
}
|
|
});
|
|
|
|
return json(zeitraum);
|
|
} catch (error: any) {
|
|
console.error('Fehler beim Aktualisieren des Zeitraums:', error);
|
|
if (error.code === 'P2002') {
|
|
return json(
|
|
{ error: 'Ein Zeitraum mit dieser Bezeichnung existiert bereits' },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
return json({ error: 'Serverfehler' }, { status: 500 });
|
|
}
|
|
};
|
|
|
|
export const DELETE: RequestHandler = async ({ url, cookies }) => {
|
|
const adminAuth = cookies.get('admin-auth');
|
|
if (adminAuth !== 'authenticated') {
|
|
return json({ error: 'Nicht autorisiert' }, { status: 401 });
|
|
}
|
|
|
|
try {
|
|
const id = url.searchParams.get('id');
|
|
if (!id) {
|
|
return json({ error: 'ID erforderlich' }, { status: 400 });
|
|
}
|
|
|
|
// ZeitraumPlaetze werden automatisch durch onDelete: Cascade gelöscht
|
|
await prisma.praktikumszeitraum.delete({
|
|
where: { id: parseInt(id) }
|
|
});
|
|
|
|
return json({ success: true });
|
|
} catch (error) {
|
|
console.error('Fehler beim Löschen des Zeitraums:', error);
|
|
return json({ error: 'Serverfehler' }, { status: 500 });
|
|
}
|
|
};
|