From 38afd41ca0e2be714ef70ea709766b8492280bba Mon Sep 17 00:00:00 2001 From: Esa Kataja Date: Tue, 19 Nov 2024 22:08:38 +0200 Subject: [PATCH] Add user login logout --- src/app.d.ts | 14 +++++++++++- src/hooks.server.ts | 18 +++++++++++++++ src/lib/components/Header.svelte | 19 +++++++++++----- src/lib/components/Login.svelte | 14 +++++++++--- src/lib/index.ts | 8 +++++++ src/lib/server/auth.ts | 28 ++++++++++++++++++++++++ src/routes/+layout.server.ts | 9 ++++++++ src/routes/+layout.svelte | 5 +++-- src/routes/+page.server.ts | 33 ++++++++++++++++++++++++++++ src/routes/+page.svelte | 6 +++++ src/routes/gameroom/+page.server.ts | 7 ++++++ src/routes/gameroom/+page.svelte | 6 +++++ src/routes/login/+page.server.ts | 34 +++++++++++++++++++++++++++++ src/routes/login/+page.svelte | 19 +++++++++++++++- src/routes/logout/+page.server.ts | 10 +++++++++ 15 files changed, 218 insertions(+), 12 deletions(-) create mode 100644 src/hooks.server.ts create mode 100644 src/lib/server/auth.ts create mode 100644 src/routes/+layout.server.ts create mode 100644 src/routes/+page.server.ts create mode 100644 src/routes/gameroom/+page.server.ts create mode 100644 src/routes/gameroom/+page.svelte create mode 100644 src/routes/login/+page.server.ts create mode 100644 src/routes/logout/+page.server.ts diff --git a/src/app.d.ts b/src/app.d.ts index da08e6d..d04da19 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -3,7 +3,19 @@ declare global { namespace App { // interface Error {} - // interface Locals {} + interface Locals { + user: { + id: string; + username: string; + email: string; + avatar_url: string; + is_active: boolean; + is_admin: boolean; + last_login: string; + created_at: string; + modified_at: string; + }; + } // interface PageData {} // interface PageState {} // interface Platform {} diff --git a/src/hooks.server.ts b/src/hooks.server.ts new file mode 100644 index 0000000..ad0ee34 --- /dev/null +++ b/src/hooks.server.ts @@ -0,0 +1,18 @@ +import { authenticateUser } from '$lib/server/auth'; +import type { Handle } from '@sveltejs/kit'; +import { redirect } from '@sveltejs/kit'; + +export const handle: Handle = async ({ event, resolve }) => { + if (event.url.pathname.startsWith('/gameroom')) { + const current_user = await authenticateUser(event); + if (!current_user) { + throw redirect(302, '/login'); + } + event.locals.user = current_user; + + + } + + const response = await resolve(event); + return response; +}; \ No newline at end of file diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte index 1730cc0..3f8736e 100644 --- a/src/lib/components/Header.svelte +++ b/src/lib/components/Header.svelte @@ -1,8 +1,13 @@ -
-

Paska Joululeffa 2024

- Sisään - + {#if user} + {user.username} + Ulos + {:else} + Sisään + {/if}
diff --git a/src/lib/components/Login.svelte b/src/lib/components/Login.svelte index 2db805d..af8d946 100644 --- a/src/lib/components/Login.svelte +++ b/src/lib/components/Login.svelte @@ -1,15 +1,22 @@

Kirjaudu sisään

- +
diff --git a/src/lib/index.ts b/src/lib/index.ts index 856f2b6..395f39d 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -1 +1,9 @@ // place files you want to import through the `$lib` alias in this folder. + +export const api_url = "http://localhost:8000"; + +export function decodeUSerCookie(userCookie: string) { + const decodedCookie = decodeURIComponent(userCookie); + const parsedCookie = JSON.parse(decodedCookie); + return parsedCookie; +} \ No newline at end of file diff --git a/src/lib/server/auth.ts b/src/lib/server/auth.ts new file mode 100644 index 0000000..d585ef4 --- /dev/null +++ b/src/lib/server/auth.ts @@ -0,0 +1,28 @@ +import { redirect, type RequestEvent } from '@sveltejs/kit'; + + +export const authenticateUser = (event: RequestEvent) => { + const {cookies} = event; + const userCookie = cookies.get('user'); + if (!userCookie) { + return null + } + + const decodedCookie = decodeURIComponent(userCookie); + const parsedCookie = JSON.parse(decodedCookie); + + if (!parsedCookie) { + return null + } + return parsedCookie +} + +export const logoutUser = (event: RequestEvent) => { + const {cookies} = event; + cookies.delete('user', { + path: '/', + sameSite: 'strict', + secure: false, + }); + throw redirect(302, '/login'); +} \ No newline at end of file diff --git a/src/routes/+layout.server.ts b/src/routes/+layout.server.ts new file mode 100644 index 0000000..e04bbd1 --- /dev/null +++ b/src/routes/+layout.server.ts @@ -0,0 +1,9 @@ +import type { LayoutServerLoad } from './$types'; +import { authenticateUser } from '$lib/server/auth'; + +export const load: LayoutServerLoad = async (event) => { + const user = await authenticateUser(event); + return { + user: user + }; +}; diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index b444b99..0aa12c8 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -2,7 +2,8 @@ import '../app.css'; import Header from '$lib/components/Header.svelte'; import Footer from '$lib/components/Footer.svelte'; - let { children } = $props(); + import type { LayoutData } from './$types'; + let { data, children }: { data: LayoutData; children: () => any } = $props(); @@ -10,7 +11,7 @@
-
+
{@render children()}
diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts new file mode 100644 index 0000000..9feb028 --- /dev/null +++ b/src/routes/+page.server.ts @@ -0,0 +1,33 @@ +import type { PageServerLoad } from "./$types"; +import { api_url } from "$lib"; + +type movie = { + id: string; + name: string; + imdb_id: string; + actors: Array; + plot: string; + poster_url: string; + release_date: string; + showtime: string; + is_watched: boolean; +} + +export const load: PageServerLoad = async (event) => { + + + + const get_next_movie_url = `${api_url}/movie/next`; + const response = await fetch(get_next_movie_url); + const data: movie = await response.json(); + + + const year = new Date(data.release_date).getFullYear(); + data.release_date = `${year}`; + + + return { + movie: data, + user: event.locals.user + }; +}; \ No newline at end of file diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index e69de29..bde5050 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -0,0 +1,6 @@ + + + diff --git a/src/routes/gameroom/+page.server.ts b/src/routes/gameroom/+page.server.ts new file mode 100644 index 0000000..6f21cb3 --- /dev/null +++ b/src/routes/gameroom/+page.server.ts @@ -0,0 +1,7 @@ +import type { PageServerLoad } from "./$types"; + +export const load: PageServerLoad = async (event) => { + return { + user: event.locals.user + }; +}; \ No newline at end of file diff --git a/src/routes/gameroom/+page.svelte b/src/routes/gameroom/+page.svelte new file mode 100644 index 0000000..e7272b9 --- /dev/null +++ b/src/routes/gameroom/+page.svelte @@ -0,0 +1,6 @@ + + +

gameroom

diff --git a/src/routes/login/+page.server.ts b/src/routes/login/+page.server.ts new file mode 100644 index 0000000..62ab62d --- /dev/null +++ b/src/routes/login/+page.server.ts @@ -0,0 +1,34 @@ +import { redirect } from '@sveltejs/kit'; +import type { Actions } from './$types'; + + +const api_url = import.meta.env.VITE_API_URL + + +export const actions: Actions = { + login: async ({ request, cookies }) => { + const formData = await request.formData(); + const login_data = Object.fromEntries(formData); + const response = await fetch(`${api_url}/user/login`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(login_data) + }); + + + if (response.ok) { + const user_data = await response.json() + const encodedUserData = encodeURIComponent(JSON.stringify(user_data)); + cookies.set('user', encodedUserData, { + path: '/', + sameSite: 'strict', + secure: false, + maxAge: 60 * 60 * 24 + }); + throw redirect(302, '/gameroom'); + } + } + +}; \ No newline at end of file diff --git a/src/routes/login/+page.svelte b/src/routes/login/+page.svelte index a5e7826..2202a7d 100644 --- a/src/routes/login/+page.svelte +++ b/src/routes/login/+page.svelte @@ -1,5 +1,22 @@ - diff --git a/src/routes/logout/+page.server.ts b/src/routes/logout/+page.server.ts new file mode 100644 index 0000000..35ca755 --- /dev/null +++ b/src/routes/logout/+page.server.ts @@ -0,0 +1,10 @@ +import type { PageServerLoad } from "./$types"; +import { redirect } from '@sveltejs/kit'; +export const load: PageServerLoad = async (event) => { + event.cookies.delete('user', { + path: '/', + sameSite: 'strict', + secure: false, + }); + throw redirect(302, '/login'); +}; \ No newline at end of file