diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 9c82231..5f777a2 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -56,6 +56,7 @@
diff --git a/src/routes/api/eventTypes/+server.ts b/src/routes/api/eventTypes/+server.ts new file mode 100644 index 0000000..6c178bb --- /dev/null +++ b/src/routes/api/eventTypes/+server.ts @@ -0,0 +1,21 @@ +import { json } from '@sveltejs/kit'; +import { db } from '$lib/server/db'; +import { eventTypes } from '$lib/server/db/schema'; + +export async function POST({ request, locals }) { + if (!locals.user) return new Response('Unauthorized', { status: 401 }); + + const body = await request.json(); + const { name, scoringPreset, resultPreset } = body; + + if (!name || scoringPreset == null || resultPreset == null) { + return json({ error: 'Missing required fields' }, { status: 400 }); + } + + const [inserted] = await db + .insert(eventTypes) + .values({ name, scoringPreset, resultPreset }) + .returning(); + + return json(inserted); +} diff --git a/src/routes/api/registerEvent/+server.ts b/src/routes/api/registerEvent/+server.ts new file mode 100644 index 0000000..13278e8 --- /dev/null +++ b/src/routes/api/registerEvent/+server.ts @@ -0,0 +1,24 @@ +import { json } from '@sveltejs/kit'; +import { db } from '$lib/server/db'; +import { registeredEvents } from '$lib/server/db/schema'; +import { globalEmitter } from '$lib/server/globalEmitter'; + +export async function POST({ request, locals }) { + if (!locals.user) return new Response('Unauthorized', { status: 401 }); + + const body = await request.json(); + const { eventType, division } = body; + + if (eventType == null || division == null) { + return json({ error: 'Missing required fields' }, { status: 400 }); + } + + const [inserted] = await db + .insert(registeredEvents) + .values({ eventType, division, state: 0 }) + .returning(); + + globalEmitter.emit('eventUpdate'); + + return json(inserted); +} diff --git a/src/routes/manage-events/+page.server.ts b/src/routes/manage-events/+page.server.ts new file mode 100644 index 0000000..098da39 --- /dev/null +++ b/src/routes/manage-events/+page.server.ts @@ -0,0 +1,74 @@ +import { error, redirect } from '@sveltejs/kit'; +import { eq } from 'drizzle-orm'; +import { db } from '$lib/server/db'; +import { + scorers, + eventTypes, + registeredEvents, + divisions, + scoringPresets, + resultPresets, + teams +} from '$lib/server/db/schema'; +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ locals }) => { + if (!locals.user) throw redirect(303, '/login'); + + const [row] = await db + .select({ role: scorers.role }) + .from(scorers) + .where(eq(scorers.id, locals.user.id)); + + if (row?.role !== 'admin') throw error(403, 'Forbidden'); + + const eventTypeList = await db.select().from(eventTypes).orderBy(eventTypes.id); + const divisionList = await db.select().from(divisions).orderBy(divisions.id); + const resultPresetList = await db.select().from(resultPresets).orderBy(resultPresets.id); + + const scoringPresetRows = await db + .select() + .from(scoringPresets) + .orderBy(scoringPresets.presetID, scoringPresets.placement); + + const scoringPresetMap = new Map| ID | +Name | +Scoring Preset | +Result Preset | + {/snippet} + {#snippet row(et: (typeof eventTypesWithPresets)[number])} +{et.id} | +{et.name} | +{et.scoringPresetDescription} | +{et.resultPresetName} | + {/snippet} +
|---|
| ID | +Event Name | +Division | +State | +Winner | + {/snippet} + {#snippet row(event: (typeof data.registeredEvents)[number])} +{event.eventId} | +{event.eventName} | +{event.division} | +{stateLabel(event.state)} | ++ {event.winnerName ?? '-'} + | + {/snippet} +
|---|