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