diff --git a/src/routes/admin/+page.svelte b/src/routes/admin/+page.svelte index ea6efc8..93abf0f 100644 --- a/src/routes/admin/+page.svelte +++ b/src/routes/admin/+page.svelte @@ -39,8 +39,8 @@ 🏢 Dienststellen verwalten - - 🗓 Zeitraum verwaltung + + 🗓 Praktikumzeiträume verwalten 👨‍💼 Passwort ädern diff --git a/src/routes/admin/zeitraum/+page.server.ts b/src/routes/admin/zeitraeume/+page.server.ts similarity index 100% rename from src/routes/admin/zeitraum/+page.server.ts rename to src/routes/admin/zeitraeume/+page.server.ts diff --git a/src/routes/admin/zeitraeume/+page.svelte b/src/routes/admin/zeitraeume/+page.svelte new file mode 100644 index 0000000..ef2559c --- /dev/null +++ b/src/routes/admin/zeitraeume/+page.svelte @@ -0,0 +1,167 @@ + + +
+

Praktikumszeiträume verwalten

+ + +
+ + + + + +
+ + + {#if fehlermeldung} +

{fehlermeldung}

+ {/if} + + +
+
+ +
+
Bezeichnung
+
Startdatum
+
Enddatum
+
Aktionen
+
+ + + {#each zeitraeume as d} +
+
{d.bezeichnung}
+
{new Date(d.startDatum).toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric' })}
+
{new Date(d.endDatum).toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric' })}
+
+ + +
+
+ {/each} +
+
+ + +
+ +
+
+ + \ No newline at end of file diff --git a/src/routes/admin/zeitraum/+page.svelte b/src/routes/admin/zeitraum/+page.svelte deleted file mode 100644 index 903d8e6..0000000 --- a/src/routes/admin/zeitraum/+page.svelte +++ /dev/null @@ -1,50 +0,0 @@ - - -

🗓 Praktikumszeiträume verwalten

- -
- -
- - -
- -
- -

📋 Bereits erfasste Zeiträume

-
- {#each zeitraeume as z} -
-

{z.bezeichnung}

-

- {new Date(z.startDatum).toLocaleDateString()} – {new Date(z.endDatum).toLocaleDateString()} -

-
- {/each} -
- - \ No newline at end of file diff --git a/src/routes/api/admin/zeitraeume/+server.ts b/src/routes/api/admin/zeitraeume/+server.ts new file mode 100644 index 0000000..f88d4f5 --- /dev/null +++ b/src/routes/api/admin/zeitraeume/+server.ts @@ -0,0 +1,84 @@ +import { PrismaClient } from '@prisma/client'; +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; + +const prisma = new PrismaClient(); + +import type { Cookies } from '@sveltejs/kit'; + +function checkAuth(cookies: Cookies) { + return cookies.get('admin_session') === 'true'; +} + +function isValidDate(date: string | Date) { + const parsed = new Date(date) + return !isNaN(parsed.getTime()) +} + +export const GET: RequestHandler = async ({ cookies }) => { + if (!checkAuth(cookies)) return new Response('Nicht erlaubt', { status: 401 }); + const zeitraeume = await prisma.praktikumszeitraum.findMany(); + return json(zeitraeume); +}; + +export const POST: RequestHandler = async ({ cookies, request }) => { + if (!checkAuth(cookies)) return new Response('Nicht erlaubt', { status: 401 }); + const { bezeichnung, startDatum, endDatum } = await request.json(); + if (!isValidDate(startDatum) || !isValidDate(endDatum)) { + return json({ error: 'UngĂĽltige Datum' }, { status: 400 }); + } + try { + const created = await prisma.praktikumszeitraum.create({ data: { + bezeichnung, + startDatum: new Date(startDatum), + endDatum: new Date(endDatum) + } }); + return json(created); + } catch (e) { + console.error('Fehler beim Hinzufuegen:', e); + return json({ error: 'Zeitraum existiert bereits' }, { status: 400 }); + } +}; + +export const PATCH: RequestHandler = async ({ cookies, request }) => { + if (!checkAuth(cookies)) return new Response('Nicht erlaubt', { status: 401 }); + + const { id, bezeichnung, startDatum, endDatum } = await request.json(); + + if (typeof id !== 'number' || isNaN(id) || !name || isValidDate(startDatum) || isValidDate(endDatum)) { + return json({ error: 'UngĂĽltige Eingabedaten' }, { status: 400 }); + } + + const existing = await prisma.praktikumszeitraum.findUnique({ where: { id } }); + if (!existing) { + return json({ error: 'Zeitraum nicht gefunden' }, { status: 404 }); + } + + const konflikt = await prisma.praktikumszeitraum.findFirst({ + where: { + bezeichnung, + NOT: { id }, + }, + }); + if (konflikt) { + return json({ error: 'Eine andere Praktikumszeitraum mit diesem Namen existiert bereits' }, { status: 400 }); + } + + try { + const updated = await prisma.praktikumszeitraum.update({ + where: { id }, + data: { bezeichnung, startDatum, endDatum }, + }); + return json(updated); + } catch (e) { + console.error('Fehler beim Update:', e); + return json({ error: 'Update fehlgeschlagen' }, { status: 400 }); + } +}; + +export const DELETE: RequestHandler = async ({ cookies, url }) => { + if (!checkAuth(cookies)) return new Response('Nicht erlaubt', { status: 401 }); + const id = Number(url.searchParams.get('id')); + await prisma.praktikumszeitraum.delete({ where: { id } }); + return json({ success: true }); +}; \ No newline at end of file diff --git a/src/routes/api/admin/zeitraum/+server.ts b/src/routes/api/admin/zeitraum/+server.ts deleted file mode 100644 index ee955e0..0000000 --- a/src/routes/api/admin/zeitraum/+server.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { db } from '$lib/server/prisma' - -export async function GET() { - const zeitraeume = await db.praktikumszeitraum.findMany({ - orderBy: { startDatum: 'asc' } - }) - return new Response(JSON.stringify(zeitraeume)) -} - -export async function POST({ request }) { - const { bezeichnung, startDatum, endDatum } = await request.json() - - await db.praktikumszeitraum.create({ - data: { - bezeichnung, - startDatum: new Date(startDatum), - endDatum: new Date(endDatum) - } - }) - - return new Response('OK') -} \ No newline at end of file