Files
praktikum/src/routes/api/admin/zeitraeume/+server.ts

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