praktikum refinemend Plaetze pro Dienstelle und Pro Zeitraum

This commit is contained in:
titver968
2025-11-26 15:27:21 +01:00
parent be9228b71d
commit 89bf0298ce
40 changed files with 2932 additions and 1247 deletions

View File

@@ -1,160 +1,141 @@
import { PrismaClient } from '@prisma/client';
// src/routes/api/admin/zeitraeume/+server.ts
import { json } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import { prisma } from '$lib/prisma';
const prisma = new PrismaClient();
import type { Cookies } from '@sveltejs/kit';
// Korrigierte Auth-Funktion mit neuem Cookie-Namen
function checkAuth(cookies: Cookies) {
return cookies.get('admin-auth') === 'authenticated';
}
function isValidDate(date: string | Date) {
const parsed = new Date(date)
return !isNaN(parsed.getTime())
// 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 0 Plätzen
for (const dienststelle of dienststellen) {
await prisma.zeitraumPlaetze.create({
data: {
zeitraumId: zeitraumId,
dienststelleId: dienststelle.id,
plaetze: 0 // Standardwert: 0 Plätze
}
});
}
}
export const GET: RequestHandler = async ({ cookies }) => {
if (!checkAuth(cookies)) {
return new Response(
JSON.stringify({ error: 'Nicht autorisiert' }),
{
status: 401,
headers: { 'Content-Type': 'application/json' }
}
);
const adminAuth = cookies.get('admin-auth');
if (adminAuth !== 'authenticated') {
return json({ error: 'Nicht autorisiert' }, { status: 401 });
}
try {
const zeitraeume = await prisma.praktikumszeitraum.findMany();
const zeitraeume = await prisma.praktikumszeitraum.findMany({
orderBy: { startDatum: 'desc' }
});
return json(zeitraeume);
} catch (error) {
console.error('Fehler beim Laden der Praktikumszeiträume:', error);
return json({ error: 'Fehler beim Laden der Praktikumszeiträume' }, { status: 500 });
console.error('Fehler beim Laden der Zeiträume:', error);
return json({ error: 'Serverfehler' }, { status: 500 });
}
};
export const POST: RequestHandler = async ({ cookies, request }) => {
if (!checkAuth(cookies)) {
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();
// Validierung
if (!bezeichnung || typeof bezeichnung !== 'string' || bezeichnung.trim().length === 0) {
return json({ error: 'Bezeichnung ist erforderlich' }, { status: 400 });
if (!bezeichnung || !startDatum || !endDatum) {
return json({ error: 'Alle Felder sind erforderlich' }, { status: 400 });
}
if (!isValidDate(startDatum) || !isValidDate(endDatum)) {
return json({ error: 'Ungültiges Datum' }, { 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 created = await prisma.praktikumszeitraum.create({
data: {
bezeichnung: bezeichnung.trim(),
startDatum: new Date(startDatum),
endDatum: new Date(endDatum)
}
const zeitraum = await prisma.praktikumszeitraum.create({
data: {
bezeichnung,
startDatum: start,
endDatum: end
}
});
return json(created, { status: 201 });
} catch (error) {
console.error('Fehler beim Erstellen des Praktikumszeitraums:', error);
return json({ error: 'Fehler beim Erstellen des Praktikumszeitraums' }, { status: 500 });
// Automatisch ZeitraumPlaetze für alle existierenden Dienststellen erstellen
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 ({ cookies, request }) => {
if (!checkAuth(cookies)) {
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();
// Validierung
if (typeof id !== 'number' || isNaN(id)) {
return json({ error: 'Ungültige ID' }, { status: 400 });
if (!id || !bezeichnung || !startDatum || !endDatum) {
return json({ error: 'Alle Felder sind erforderlich' }, { status: 400 });
}
if (!bezeichnung || typeof bezeichnung !== 'string' || bezeichnung.trim().length === 0) {
return json({ error: 'Bezeichnung ist 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 });
}
if (!isValidDate(startDatum) || !isValidDate(endDatum)) {
return json({ error: 'Ungültiges Datum' }, { status: 400 });
}
// Prüfe ob Praktikumszeitraum existiert
const existing = await prisma.praktikumszeitraum.findUnique({ where: { id } });
if (!existing) {
return json({ error: 'Praktikumszeitraum nicht gefunden' }, { status: 404 });
}
// Prüfe ob neue Bezeichnung bereits bei anderem Zeitraum existiert
const konflikt = await prisma.praktikumszeitraum.findFirst({
where: {
bezeichnung: bezeichnung.trim(),
NOT: { id },
},
const zeitraum = await prisma.praktikumszeitraum.update({
where: { id: parseInt(id) },
data: {
bezeichnung,
startDatum: start,
endDatum: end
}
});
if (konflikt) {
return json({ error: 'Ein anderer Praktikumszeitraum mit dieser Bezeichnung existiert bereits' }, { status: 400 });
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 });
}
const updated = await prisma.praktikumszeitraum.update({
where: { id },
data: {
bezeichnung: bezeichnung.trim(),
startDatum: new Date(startDatum),
endDatum: new Date(endDatum)
},
});
return json(updated);
} catch (error) {
console.error('Fehler beim Aktualisieren des Praktikumszeitraums:', error);
return json({ error: 'Fehler beim Aktualisieren des Praktikumszeitraums' }, { status: 500 });
return json({ error: 'Serverfehler' }, { status: 500 });
}
};
export const DELETE: RequestHandler = async ({ cookies, url }) => {
if (!checkAuth(cookies)) {
export const DELETE: RequestHandler = async ({ url, cookies }) => {
const adminAuth = cookies.get('admin-auth');
if (adminAuth !== 'authenticated') {
return json({ error: 'Nicht autorisiert' }, { status: 401 });
}
const id = Number(url.searchParams.get('id'));
if (isNaN(id)) {
return json({ error: 'Ungültige ID' }, { status: 400 });
}
try {
// Prüfe ob Praktikumszeitraum existiert
const existing = await prisma.praktikumszeitraum.findUnique({ where: { id } });
if (!existing) {
return json({ error: 'Praktikumszeitraum nicht gefunden' }, { status: 404 });
const id = url.searchParams.get('id');
if (!id) {
return json({ error: 'ID erforderlich' }, { status: 400 });
}
// Hier könntest du prüfen, ob noch Anmeldungen mit diesem Zeitraum verknüpft sind
// const assignedCount = await prisma.anmeldung.count({
// where: { praktikumszeitraumId: id }
// });
//
// if (assignedCount > 0) {
// return json({
// error: 'Praktikumszeitraum kann nicht gelöscht werden. Es sind noch Anmeldungen damit verknüpft.'
// }, { status: 400 });
// }
// ZeitraumPlaetze werden automatisch durch onDelete: Cascade gelöscht
await prisma.praktikumszeitraum.delete({
where: { id: parseInt(id) }
});
await prisma.praktikumszeitraum.delete({ where: { id } });
return json({ success: true, message: 'Praktikumszeitraum erfolgreich gelöscht' });
return json({ success: true });
} catch (error) {
console.error('Fehler beim Löschen des Praktikumszeitraums:', error);
return json({ error: 'Fehler beim Löschen des Praktikumszeitraums' }, { status: 500 });
console.error('Fehler beim Löschen des Zeitraums:', error);
return json({ error: 'Serverfehler' }, { status: 500 });
}
};