From 5177bce04cdd99dacb2e86cbfa88895333a528e9 Mon Sep 17 00:00:00 2001 From: titver968 Date: Wed, 16 Apr 2025 11:53:18 +0200 Subject: [PATCH] admin Berreich mit Passwort --- .gitignore | 1 + prisma/praktika.db | Bin 32768 -> 32768 bytes src/routes/admin/+page.svelte | 119 +++++++++--------- src/routes/admin/anmeldungen/+page.server.ts | 8 ++ src/routes/admin/anmeldungen/+page.svelte | 40 ++++++ .../admin/dienststellen/+page.server.ts | 8 ++ src/routes/api/admin/anmeldungen/+server.ts | 10 +- src/routes/api/admin/dienststellen/+server.ts | 24 ++-- src/routes/api/admin/login/+server.ts | 17 ++- src/routes/api/admin/logout/+server.ts | 6 + 10 files changed, 153 insertions(+), 80 deletions(-) create mode 100644 src/routes/admin/anmeldungen/+page.server.ts create mode 100644 src/routes/admin/anmeldungen/+page.svelte create mode 100644 src/routes/admin/dienststellen/+page.server.ts create mode 100644 src/routes/api/admin/logout/+server.ts diff --git a/.gitignore b/.gitignore index 3b462cb..9493f25 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ node_modules .wrangler /.svelte-kit /build +/data # OS .DS_Store diff --git a/prisma/praktika.db b/prisma/praktika.db index 3895a58276064eb3d842522dab47e87a77de3420..71cff83cdc37c93c7f2bc7e55cb3c430c95a8c13 100644 GIT binary patch delta 353 zcmZo@U}|V!njp<6G*QNxQD|er5`7LP{!aKR9sY1kzZC^*;H9to0E}|)vYM8)EDF|U!bdu3=9l(4GnaS%v~};re!DQ z7MOVeCGyKsi;N9SOf3ye4GoP9O$|*AOtE>!DYd9HtvETOG$%DNNx`c$Co?ZIIio}& zH@`$Nvn(^UsDy=;ahmN+k%~q^CZKDC6&1AwWyMu(t5`8vC{wEClPc{oW9N?cgK}tiK*_Jamu|hAmw74X- zC^s=L&mlE8F*8RmIX{<|fq{XE{{aL4C;kUe4I*L!Ow6i`E}5x$#U(%;IXS7UJdDip zo4@( - let passwort = ''; - let eingeloggt = false; - let fehler = false; - let anmeldungen = []; - - async function login() { - const res = await fetch('/api/admin/login', { - method: 'POST', - body: JSON.stringify({ passwort }), - headers: { 'Content-Type': 'application/json' } - }); - - if (res.ok) { - eingeloggt = true; - fehler = false; - const result = await fetch('/api/admin/anmeldungen'); - anmeldungen = await result.json(); - } else { - fehler = true; - } + let passwort = ''; + let eingeloggt = false; + let fehler = false; + + async function login() { + const res = await fetch('/api/admin/login', { + method: 'POST', + body: JSON.stringify({ passwort }), + headers: { 'Content-Type': 'application/json' } + }); + + if (res.ok) { + eingeloggt = true; + fehler = false; + } else { + fehler = true; } - - -
- {#if !eingeloggt} -
-

Admin Login

- - - {#if fehler} -

Falsches Passwort

- {/if} + } + + +
+ {#if !eingeloggt} +
+

Admin Login

+ + + {#if fehler} +

Falsches Passwort

+ {/if} +
+ {:else} +
+

Admin-Bereich

+ - {:else} -

Dienststellen verwalten

-

Alle Anmeldungen

- - - - - - - - - - - {#each anmeldungen as a} - - - - - - - {/each} - -
NameE-MailWunsch 1–3Datum
{a.anrede} {a.vorname} {a.nachname}{a.email}{a.wunsch1}, {a.wunsch2}, {a.wunsch3}{new Date(a.timestamp).toLocaleDateString()}
- {/if} -
- - \ No newline at end of file + +
+ {/if} +
+ + \ No newline at end of file diff --git a/src/routes/admin/anmeldungen/+page.server.ts b/src/routes/admin/anmeldungen/+page.server.ts new file mode 100644 index 0000000..dd0c557 --- /dev/null +++ b/src/routes/admin/anmeldungen/+page.server.ts @@ -0,0 +1,8 @@ +import type { PageServerLoad } from '../../api/admin/anmeldungen/$types'; +import { redirect } from '@sveltejs/kit'; + +export const load: PageServerLoad = async ({ cookies }) => { + if (cookies.get('admin_session') !== 'true') { + throw redirect(303, '/admin'); + } +}; \ No newline at end of file diff --git a/src/routes/admin/anmeldungen/+page.svelte b/src/routes/admin/anmeldungen/+page.svelte new file mode 100644 index 0000000..e1f1825 --- /dev/null +++ b/src/routes/admin/anmeldungen/+page.svelte @@ -0,0 +1,40 @@ + + +
+

Alle Anmeldungen

+ + + + + + + + + + + {#each anmeldungen as a} + + + + + + + {/each} + +
NameE-MailWunsch 1–3Datum
{a.anrede} {a.vorname} {a.nachname}{a.email}{a.wunsch1.name}
{a.wunsch2.name}
{a.wunsch3.name}
{new Date(a.timestamp).toLocaleDateString()}
+
+ + \ No newline at end of file diff --git a/src/routes/admin/dienststellen/+page.server.ts b/src/routes/admin/dienststellen/+page.server.ts new file mode 100644 index 0000000..a39bc2d --- /dev/null +++ b/src/routes/admin/dienststellen/+page.server.ts @@ -0,0 +1,8 @@ +import type { PageServerLoad } from './$types'; +import { redirect } from '@sveltejs/kit'; + +export const load: PageServerLoad = async ({ cookies }) => { + if (cookies.get('admin_session') !== 'true') { + throw redirect(303, '/admin'); // zurück zur Login-Seite + } +}; \ No newline at end of file diff --git a/src/routes/api/admin/anmeldungen/+server.ts b/src/routes/api/admin/anmeldungen/+server.ts index 0fb1038..0bef532 100644 --- a/src/routes/api/admin/anmeldungen/+server.ts +++ b/src/routes/api/admin/anmeldungen/+server.ts @@ -5,11 +5,11 @@ const prisma = new PrismaClient(); export const GET: RequestHandler = async () => { const anmeldungen = await prisma.anmeldung.findMany({ - //include: { - // wunsch1: true, - // wunsch2: true, - // wunsch3: true - //}; + include: { + wunsch1: true, + wunsch2: true, + wunsch3: true + }, orderBy: { timestamp: 'desc' } }); diff --git a/src/routes/api/admin/dienststellen/+server.ts b/src/routes/api/admin/dienststellen/+server.ts index ab060c1..a459bec 100644 --- a/src/routes/api/admin/dienststellen/+server.ts +++ b/src/routes/api/admin/dienststellen/+server.ts @@ -1,25 +1,33 @@ import { PrismaClient } from '@prisma/client'; -import type { RequestHandler } from '@sveltejs/kit'; +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; const prisma = new PrismaClient(); -export const GET: RequestHandler = async () => { +function checkAuth(cookies: any) { + return cookies.get('admin_session') === 'true'; +} + +export const GET: RequestHandler = async ({ cookies }) => { + if (!checkAuth(cookies)) return new Response('Nicht erlaubt', { status: 401 }); const dienststellen = await prisma.dienststelle.findMany({ orderBy: { name: 'asc' } }); - return new Response(JSON.stringify(dienststellen)); + return json(dienststellen); }; -export const POST: RequestHandler = async ({ request }) => { +export const POST: RequestHandler = async ({ cookies, request }) => { + if (!checkAuth(cookies)) return new Response('Nicht erlaubt', { status: 401 }); const { name } = await request.json(); try { const created = await prisma.dienststelle.create({ data: { name } }); - return new Response(JSON.stringify(created)); + return json(created); } catch (e) { - return new Response(JSON.stringify({ error: 'Dienststelle existiert bereits' }), { status: 400 }); + return json({ error: 'Dienststelle existiert bereits' }, { status: 400 }); } }; -export const DELETE: RequestHandler = async ({ url }) => { +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.dienststelle.delete({ where: { id } }); - return new Response(JSON.stringify({ success: true })); + return json({ success: true }); }; \ No newline at end of file diff --git a/src/routes/api/admin/login/+server.ts b/src/routes/api/admin/login/+server.ts index 639789f..b68d469 100644 --- a/src/routes/api/admin/login/+server.ts +++ b/src/routes/api/admin/login/+server.ts @@ -1,13 +1,20 @@ -import type { RequestHandler } from '@sveltejs/kit'; +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; -const ADMIN_PASS = 'supergeheim'; // Passwort hier festlegen +const ADMIN_PASS = 'supergeheim'; // 🔒 Besser aus .env lesen -export const POST: RequestHandler = async ({ request }) => { +export const POST: RequestHandler = async ({ request, cookies }) => { const { passwort } = await request.json(); if (passwort === ADMIN_PASS) { - return new Response(JSON.stringify({ success: true })); + cookies.set('admin_session', 'true', { + path: '/', + httpOnly: true, + sameSite: 'strict', + maxAge: 60 * 60 * 4 // 4 Stunden + }); + return json({ success: true }); } - return new Response('Unauthorized', { status: 401 }); + return json({ error: 'Falsches Passwort' }, { status: 401 }); }; \ No newline at end of file diff --git a/src/routes/api/admin/logout/+server.ts b/src/routes/api/admin/logout/+server.ts new file mode 100644 index 0000000..b548e99 --- /dev/null +++ b/src/routes/api/admin/logout/+server.ts @@ -0,0 +1,6 @@ +import type { RequestHandler } from './$types'; + +export const POST: RequestHandler = async ({ cookies }) => { + cookies.delete('admin_session', { path: '/' }); + return new Response('Ausgeloggt'); +}; \ No newline at end of file