From 0ab03dd9dcb19c47403341dc894f2af4d390e429 Mon Sep 17 00:00:00 2001 From: bytedream Date: Mon, 28 Aug 2023 17:01:53 +0200 Subject: [PATCH] add admin logout --- src/lib/components/utils.ts | 5 +++++ src/routes/admin/+layout.svelte | 19 +++++++++++++++++++ src/routes/admin/admin/+page.svelte | 7 +------ src/routes/admin/logout/+server.ts | 16 ++++++++++++++++ 4 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 src/lib/components/utils.ts create mode 100644 src/routes/admin/logout/+server.ts diff --git a/src/lib/components/utils.ts b/src/lib/components/utils.ts new file mode 100644 index 0000000..9d1296e --- /dev/null +++ b/src/lib/components/utils.ts @@ -0,0 +1,5 @@ +export async function buttonTriggeredRequest(e: MouseEvent, promise: Promise) { + (e.target as HTMLButtonElement).disabled = true; + await promise; + (e.target as HTMLButtonElement).disabled = false; +} diff --git a/src/routes/admin/+layout.svelte b/src/routes/admin/+layout.svelte index e1a3e02..363e5b6 100644 --- a/src/routes/admin/+layout.svelte +++ b/src/routes/admin/+layout.svelte @@ -2,6 +2,19 @@ import { page } from '$app/stores'; import { env } from '$env/dynamic/public'; import { IconOutline } from 'svelte-heros-v2'; + import { buttonTriggeredRequest } from '$lib/components/utils'; + import { goto } from '$app/navigation'; + + async function logout() { + const response = await fetch(`${env.PUBLIC_BASE_PATH}/admin/logout`, { + method: 'POST' + }); + if (response.ok) { + await goto(`${env.PUBLIC_BASE_PATH}/`); + } else { + throw new Error(); + } + } {#if $page.url.pathname !== `${env.PUBLIC_BASE_PATH}/admin/login`} @@ -14,6 +27,12 @@ Website Admins +
  • + +
  • diff --git a/src/routes/admin/admin/+page.svelte b/src/routes/admin/admin/+page.svelte index 8b7797b..70bf3c0 100644 --- a/src/routes/admin/admin/+page.svelte +++ b/src/routes/admin/admin/+page.svelte @@ -6,6 +6,7 @@ import { Permissions } from '$lib/permissions'; import { env } from '$env/dynamic/public'; import ErrorToast from '$lib/components/Toast/ErrorToast.svelte'; + import { buttonTriggeredRequest } from '$lib/components/utils'; let allPermissionBadges = { 'Admin Read': Permissions.AdminRead, @@ -18,12 +19,6 @@ let newAdminPassword: string; let newAdminPermissions: number[]; - async function buttonTriggeredRequest(e: MouseEvent, promise: Promise) { - (e.target as HTMLButtonElement).disabled = true; - await promise; - (e.target as HTMLButtonElement).disabled = false; - } - async function addAdmin(username: string, password: string, permissions: Permissions) { const response = await fetch(`${env.PUBLIC_BASE_PATH}/admin/admin`, { method: 'POST', diff --git a/src/routes/admin/logout/+server.ts b/src/routes/admin/logout/+server.ts new file mode 100644 index 0000000..e1f75cf --- /dev/null +++ b/src/routes/admin/logout/+server.ts @@ -0,0 +1,16 @@ +import type { RequestHandler } from '@sveltejs/kit'; +import { deleteSession, getSession } from '$lib/server/session'; +import { Permissions } from '$lib/permissions'; + +export const POST = (async ({ cookies }) => { + if (getSession(cookies, [Permissions.AdminWrite]) == null) { + return new Response(null, { + status: 401 + }); + } + + deleteSession(cookies); + cookies.delete('session'); + + return new Response(); +}) satisfies RequestHandler;