From 2b309097ca145651618234476160fb30405eabe7 Mon Sep 17 00:00:00 2001 From: Linnnus Date: Mon, 17 Feb 2025 20:28:59 +0100 Subject: Initial commit --- app/src/routes/+page.svelte | 2 ++ app/src/routes/login/+page.server.ts | 39 ++++++++++++++++++++++++++++++++++ app/src/routes/login/+page.svelte | 33 ++++++++++++++++++++++++++++ app/src/routes/profile/+page.server.ts | 10 +++++++++ app/src/routes/profile/+page.svelte | 12 +++++++++++ 5 files changed, 96 insertions(+) create mode 100644 app/src/routes/+page.svelte create mode 100644 app/src/routes/login/+page.server.ts create mode 100644 app/src/routes/login/+page.svelte create mode 100644 app/src/routes/profile/+page.server.ts create mode 100644 app/src/routes/profile/+page.svelte (limited to 'app/src/routes') diff --git a/app/src/routes/+page.svelte b/app/src/routes/+page.svelte new file mode 100644 index 0000000..cc88df0 --- /dev/null +++ b/app/src/routes/+page.svelte @@ -0,0 +1,2 @@ +

Welcome to SvelteKit

+

Visit svelte.dev/docs/kit to read the documentation

diff --git a/app/src/routes/login/+page.server.ts b/app/src/routes/login/+page.server.ts new file mode 100644 index 0000000..d011af9 --- /dev/null +++ b/app/src/routes/login/+page.server.ts @@ -0,0 +1,39 @@ +import { getUser } from "$lib/server/users"; +import { createSession } from "$lib/server/sessions"; +import { fail, redirect } from "@sveltejs/kit"; +import type { Actions } from "./$types"; + +export const actions = { + default: async ({ url, cookies, request, locals: { dbConn } }) => { + const formData = Object.fromEntries(await request.formData()) as { + email?: string; + password?: string; + }; + if (!formData.email || !formData.password) { + return fail(400, { failure: true, error: "Du skal udfylde alle felterne!" }); + } + + const user = await getUser(dbConn, formData.email, formData.password); + if (!user) { + // It's important that we don't leak _which_ value is missing. + return fail(404, { failure: true, error: "Forkert email/kodeord kombi!" }); + } + console.debug("Found user %o", user); + + // The user has proven that they posses the right credentials. In return they gain a session token, which can be used to authenticate future requests. + const session = await createSession(dbConn, user.id); + cookies.set("SESSION_ID", session.token, { + path: "/", + secure: true, + sameSite: "strict", + }); + console.debug("Created session %o", session); + + // If sent here from trying to access another page without session cookie. + if (url.searchParams.has("redirectTo")) { + return redirect(303, url.searchParams.get("redirectTo")!); + } + + return { success: true }; + }, +} satisfies Actions; diff --git a/app/src/routes/login/+page.svelte b/app/src/routes/login/+page.svelte new file mode 100644 index 0000000..3e3e3c7 --- /dev/null +++ b/app/src/routes/login/+page.svelte @@ -0,0 +1,33 @@ + + + + Log ind + + + +{#if form?.success} +

Du er nu logget ind!

+{/if} + +
+ {#if form?.failure}

{form?.error}

{/if} + + + +
+ + diff --git a/app/src/routes/profile/+page.server.ts b/app/src/routes/profile/+page.server.ts new file mode 100644 index 0000000..5c9b9d3 --- /dev/null +++ b/app/src/routes/profile/+page.server.ts @@ -0,0 +1,10 @@ +import type { PageServerLoad } from "./$types"; +import { redirect } from "@sveltejs/kit"; + +export const load = (async ({ url, locals }) => { + if (!locals.user) { + redirect(303, `/login?redirectTo=${encodeURIComponent(url.toString())}`); + } + + return { user: locals.user }; +}) satisfies PageServerLoad; diff --git a/app/src/routes/profile/+page.svelte b/app/src/routes/profile/+page.svelte new file mode 100644 index 0000000..0ee18f0 --- /dev/null +++ b/app/src/routes/profile/+page.svelte @@ -0,0 +1,12 @@ + + + +Dummy profile picture +

Hej, {data.user.firstName} {data.user.lastName}!

+ + -- cgit v1.2.3