From 235dfe30947fa6678f978fc38d38bce13c3b4961 Mon Sep 17 00:00:00 2001 From: bytedream Date: Thu, 30 Nov 2023 19:15:00 +0100 Subject: [PATCH] add admin settings --- src/lib/permissions.ts | 12 ++++++- src/lib/server/database.ts | 17 ++++++++- src/routes/admin/+layout.server.ts | 1 + src/routes/admin/+layout.svelte | 15 ++++++-- src/routes/admin/+page.svelte | 8 ++++- src/routes/admin/admin/+page.svelte | 4 ++- src/routes/admin/settings/+page.server.ts | 30 ++++++++++++++++ src/routes/admin/settings/+page.svelte | 42 +++++++++++++++++++++++ src/routes/admin/settings/+server.ts | 30 ++++++++++++++++ src/routes/register/+page.server.ts | 8 +++++ src/routes/register/+page.svelte | 12 ++++++- src/routes/register/+server.ts | 6 +++- 12 files changed, 176 insertions(+), 9 deletions(-) create mode 100644 src/routes/admin/settings/+page.server.ts create mode 100644 src/routes/admin/settings/+page.svelte create mode 100644 src/routes/admin/settings/+server.ts create mode 100644 src/routes/register/+page.server.ts diff --git a/src/lib/permissions.ts b/src/lib/permissions.ts index d6d4238..96dbab3 100644 --- a/src/lib/permissions.ts +++ b/src/lib/permissions.ts @@ -5,6 +5,8 @@ export class Permissions { static readonly UserWrite = 16; static readonly ReportRead = 32; static readonly ReportWrite = 64; + static readonly SettingsRead = 128; + static readonly SettingsWrite = 256; readonly value: number; @@ -33,7 +35,9 @@ export class Permissions { Permissions.UserRead, Permissions.UserWrite, Permissions.ReportRead, - Permissions.ReportWrite + Permissions.ReportWrite, + Permissions.SettingsRead, + Permissions.SettingsWrite ]; } @@ -55,6 +59,12 @@ export class Permissions { reportWrite(): boolean { return (this.value & Permissions.ReportWrite) != 0; } + settingsRead(): boolean { + return (this.value & Permissions.SettingsRead) != 0; + } + settingsWrite(): boolean { + return (this.value & Permissions.SettingsWrite) != 0; + } asArray(): number[] { const array = []; diff --git a/src/lib/server/database.ts b/src/lib/server/database.ts index 397a524..9208493 100644 --- a/src/lib/server/database.ts +++ b/src/lib/server/database.ts @@ -103,8 +103,23 @@ export class Admin extends Model { } } +@Table({ modelName: 'settings', underscored: true }) +export class Settings extends Model { + @Column({ type: DataTypes.STRING, allowNull: false, unique: true }) + declare key: string; + @Column({ + type: DataTypes.STRING, + allowNull: false, + get(this: Settings): any { + const value = this.getDataValue('value'); + return value != null ? JSON.parse(value) : null; + } + }) + declare value: string; +} + export const sequelize = new Sequelize(building ? 'sqlite::memory:' : env.DATABASE_URI, { // only log sql queries in dev mode logging: dev ? console.log : false, - models: [User, Report, Admin] + models: [User, Report, Admin, Settings] }); diff --git a/src/routes/admin/+layout.server.ts b/src/routes/admin/+layout.server.ts index 89c4d3f..1de97d0 100644 --- a/src/routes/admin/+layout.server.ts +++ b/src/routes/admin/+layout.server.ts @@ -16,6 +16,7 @@ export const load: LayoutServerLoad = async ({ route, cookies }) => { ? await Report.count({ where: { draft: false, status: ['none', 'review'] } }) : null, adminCount: session?.permissions.adminRead() ? await Admin.count() : null, + settingsRead: session?.permissions.settingsRead(), self: session ? JSON.parse(JSON.stringify(await Admin.findOne({ where: { id: session.userId } }))) : null diff --git a/src/routes/admin/+layout.svelte b/src/routes/admin/+layout.svelte index 0808eef..3345805 100644 --- a/src/routes/admin/+layout.svelte +++ b/src/routes/admin/+layout.svelte @@ -1,7 +1,7 @@ @@ -57,7 +64,9 @@ {tab.name} -
{tab.badge}
+ {#if tab.badge != null} +
{tab.badge}
+ {/if}
{/if} @@ -74,7 +83,7 @@ -
+
{:else} diff --git a/src/routes/admin/+page.svelte b/src/routes/admin/+page.svelte index 6a086c7..2b3d10f 100644 --- a/src/routes/admin/+page.svelte +++ b/src/routes/admin/+page.svelte @@ -1,7 +1,7 @@ diff --git a/src/routes/admin/admin/+page.svelte b/src/routes/admin/admin/+page.svelte index 339066e..94d1c16 100644 --- a/src/routes/admin/admin/+page.svelte +++ b/src/routes/admin/admin/+page.svelte @@ -16,7 +16,9 @@ 'User Read': Permissions.UserRead, 'User Write': Permissions.UserWrite, 'Report Read': Permissions.ReportRead, - 'Report Write': Permissions.ReportWrite + 'Report Write': Permissions.ReportWrite, + 'Settings Read': Permissions.SettingsRead, + 'Settings Write': Permissions.SettingsWrite }; let newAdminUsername: string; diff --git a/src/routes/admin/settings/+page.server.ts b/src/routes/admin/settings/+page.server.ts new file mode 100644 index 0000000..87b4324 --- /dev/null +++ b/src/routes/admin/settings/+page.server.ts @@ -0,0 +1,30 @@ +import type { PageServerLoad } from './$types'; +import { getSession } from '$lib/server/session'; +import { Permissions } from '$lib/permissions'; +import { redirect } from '@sveltejs/kit'; +import { env } from '$env/dynamic/public'; +import { Settings } from '$lib/server/database'; + +export const load: PageServerLoad = async ({ parent, cookies }) => { + if (getSession(cookies, { permissions: [Permissions.SettingsRead] }) == null) { + throw redirect(302, `${env.PUBLIC_BASE_PATH}/admin`); + } + + const { self } = await parent(); + + const settings = (await Settings.findAll()).reduce( + (prev, curr) => { + return { ...prev, [curr.key]: curr.value }; + }, + {} as { [key: string]: any } + ); + + return { + settings: { + register: { + enabled: settings['register.enabled'] ?? true + } + }, + self: self + }; +}; diff --git a/src/routes/admin/settings/+page.svelte b/src/routes/admin/settings/+page.svelte new file mode 100644 index 0000000..fa55538 --- /dev/null +++ b/src/routes/admin/settings/+page.svelte @@ -0,0 +1,42 @@ + + +
+
+
+
Anmeldung
+ +
+
+
+ +
+
diff --git a/src/routes/admin/settings/+server.ts b/src/routes/admin/settings/+server.ts new file mode 100644 index 0000000..cc87c33 --- /dev/null +++ b/src/routes/admin/settings/+server.ts @@ -0,0 +1,30 @@ +import type { PageData } from './$types'; +import type { RequestHandler } from '@sveltejs/kit'; +import { getSession } from '$lib/server/session'; +import { Permissions } from '$lib/permissions'; +import { Settings } from '$lib/server/database'; + +export const POST = (async ({ request, cookies }) => { + if (getSession(cookies, { permissions: [Permissions.SettingsWrite] }) == null) { + return new Response(null, { + status: 401 + }); + } + + const settings: PageData['settings'] = await request.json(); + + for (const [key, value] of Object.entries(settings.register)) { + const setting = await Settings.findOne({ where: { key: `register.${key}` } }); + if (setting) { + setting.value = JSON.stringify(value); + await setting.save(); + } else { + await Settings.create({ + key: `register.${key}`, + value: JSON.stringify(value) + }); + } + } + + return new Response(); +}) satisfies RequestHandler; diff --git a/src/routes/register/+page.server.ts b/src/routes/register/+page.server.ts new file mode 100644 index 0000000..d4ec59b --- /dev/null +++ b/src/routes/register/+page.server.ts @@ -0,0 +1,8 @@ +import type { PageServerLoad } from './$types'; +import { Settings } from '$lib/server/database'; + +export const load: PageServerLoad = async () => { + return { + enabled: (await Settings.findOne({ where: { key: 'register.enabled' } }))?.value ?? true + }; +}; diff --git a/src/routes/register/+page.svelte b/src/routes/register/+page.svelte index 3613a5d..f5388ef 100644 --- a/src/routes/register/+page.svelte +++ b/src/routes/register/+page.svelte @@ -2,9 +2,12 @@ import { fly } from 'svelte/transition'; import RegistrationComplete from './RegistrationComplete.svelte'; import Register from './Register.svelte'; + import type { PageData } from './$types'; let registered = false; let username: string | null = null; + + export let data: PageData; @@ -13,9 +16,16 @@
+ {#if !data.enabled} +
+

Anmeldung geschlossen

+
+ {/if} {#if !registered}
{ + if ((await Settings.findOne({ where: { key: 'register.enabled' } }))?.value === false) { + throw error(400, 'Anmeldung geschlossen'); + } + const data = await request.formData(); const firstname = data.get('firstname') as string | null; const lastname = data.get('lastname') as string | null;