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