This commit is contained in:
30
src/routes/admin/settings/+page.server.ts
Normal file
30
src/routes/admin/settings/+page.server.ts
Normal file
@ -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
|
||||
};
|
||||
};
|
42
src/routes/admin/settings/+page.svelte
Normal file
42
src/routes/admin/settings/+page.svelte
Normal file
@ -0,0 +1,42 @@
|
||||
<script lang="ts">
|
||||
import type { PageData } from './$types';
|
||||
import { env } from '$env/dynamic/public';
|
||||
export let data: PageData;
|
||||
let settings = structuredClone(data.settings);
|
||||
|
||||
async function change() {
|
||||
await fetch(`${env.PUBLIC_BASE_PATH}/admin/settings`, {
|
||||
method: 'POST',
|
||||
body: JSON.stringify({
|
||||
register: {
|
||||
enabled: returnIfNoDup(settings.register.enabled, data.settings.register.enabled)
|
||||
}
|
||||
} as PageData['settings'])
|
||||
});
|
||||
data.settings = settings;
|
||||
settings = structuredClone(data.settings);
|
||||
}
|
||||
|
||||
function returnIfNoDup<T>(value: T, original: T): T | undefined {
|
||||
return value != original ? value : undefined;
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="h-full flex flex-col items-center justify-between">
|
||||
<div class="grid grid-cols-3 w-full [&>*]:mx-8">
|
||||
<div>
|
||||
<div class="divider">Anmeldung</div>
|
||||
<label class="label cursor-pointer">
|
||||
<span class="label-text">Aktiviert</span>
|
||||
<input type="checkbox" class="toggle" bind:checked={settings.register.enabled} />
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-6">
|
||||
<button
|
||||
class="btn btn-success mt-auto"
|
||||
class:btn-disabled={JSON.stringify(data.settings) === JSON.stringify(settings)}
|
||||
on:click={change}>Speichern</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
30
src/routes/admin/settings/+server.ts
Normal file
30
src/routes/admin/settings/+server.ts
Normal file
@ -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;
|
Reference in New Issue
Block a user