diff --git a/TODO.md b/TODO.md index db53afb..a605373 100644 --- a/TODO.md +++ b/TODO.md @@ -2,15 +2,6 @@ player view - all registered events and scores for those events team view - all registered players and all points gained from them - Do i need this? -# Login stuff - HIGH PRIORITY -disableable register button on the login page for end users -make a way to toggle on and off the register page -protect the register endpoint?? (low prio) - -# Ledger - HIGH PRIORITY -ledger view -inserting manually into ledger - # Database - HIGH PRIORITY load results from the excel sheet i made export whole contest results to csv @@ -29,7 +20,5 @@ result amendments ## Easy shit animations for all leaderboards -Ongoing since... or ongoing for... on the main page -displaying averages of loaded scores when there's more than one (easy, low prio) fix the layout on event view to match the homepage view fix the marquee animation thing and make it global diff --git a/src/lib/server/databaseManager.ts b/src/lib/server/databaseManager.ts index da9205b..0c01b01 100644 --- a/src/lib/server/databaseManager.ts +++ b/src/lib/server/databaseManager.ts @@ -3,6 +3,21 @@ import { sql, eq, and, desc, inArray } from 'drizzle-orm'; import * as schema from '$lib/server/db/schema'; import { globalEmitter } from './globalEmitter'; +export async function getSetting(key: string): Promise { + const [row] = await db + .select({ value: schema.settings.value }) + .from(schema.settings) + .where(eq(schema.settings.key, key)); + return row?.value ?? null; +} + +export async function setSetting(key: string, value: string): Promise { + await db + .insert(schema.settings) + .values({ key, value }) + .onConflictDoUpdate({ target: schema.settings.key, set: { value } }); +} + // Initial data for page load export async function getAllInitialInfo() { return { diff --git a/src/lib/server/db/schema.ts b/src/lib/server/db/schema.ts index f02e084..89f7eb1 100644 --- a/src/lib/server/db/schema.ts +++ b/src/lib/server/db/schema.ts @@ -156,6 +156,11 @@ export const registeredEventsView = sqliteView('registeredEventsView').as((qb) = .innerJoin(divisions, eq(registeredEvents.division, divisions.id)); }); +export const settings = sqliteTable('settings', { + key: text('key').primaryKey(), + value: text('value').notNull() +}); + export const registeredEventPlayersView = sqliteView('registeredEventPlayersView').as((qb) => { return qb .select({ diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 2314851..d4b3bfe 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -22,6 +22,11 @@ border-solid border-red-500 px-2" href="/ledger">ledger + settings {/if} {#if data.user} { +export const load = async ({ locals }) => { + const requireLogin = (await getSetting('requireLoginForLeaderboard')) === 'true'; + if (requireLogin && !locals.user) { + throw redirect(303, '/login'); + } + return await getAllInitialInfo(); }; diff --git a/src/routes/register/+page.server.ts b/src/routes/register/+page.server.ts index ee0c335..54434d3 100644 --- a/src/routes/register/+page.server.ts +++ b/src/routes/register/+page.server.ts @@ -4,10 +4,21 @@ import { eq } from 'drizzle-orm'; import { db } from '$lib/server/db'; import { scorers } from '$lib/server/db/schema'; import { generateSessionToken, createSession, setSessionTokenCookie } from '$lib/server/auth'; -import type { Actions } from '../signup/$types'; +import { getSetting } from '$lib/server/databaseManager'; +import type { PageServerLoad, Actions } from '../signup/$types'; + +export const load: PageServerLoad = async () => { + const disabled = (await getSetting('disableRegistration')) === 'true'; + return { disabled }; +}; export const actions: Actions = { default: async (event) => { + const disabled = (await getSetting('disableRegistration')) === 'true'; + if (disabled) { + return fail(403, { message: 'Registration is currently disabled by an administrator.' }); + } + const data = await event.request.formData(); const username = data.get('username') as string; const password = data.get('password') as string; diff --git a/src/routes/register/+page.svelte b/src/routes/register/+page.svelte index ae272ac..7a02a20 100644 --- a/src/routes/register/+page.svelte +++ b/src/routes/register/+page.svelte @@ -1,38 +1,43 @@