diff --git a/src/lib/server/db/schema.ts b/src/lib/server/db/schema.ts index 237f2c4..a1c4446 100644 --- a/src/lib/server/db/schema.ts +++ b/src/lib/server/db/schema.ts @@ -72,7 +72,7 @@ export const ledger = sqliteTable('ledger', { .default(sql`(unixepoch())`), type: text('type').notNull().default('event'), event: integer('event').references(() => events.id), - scorer: text('scorer').references(() => scorers.id) + scorer: integer('scorer').references(() => scorers.id) }); export const ledgerScores = sqliteTable('ledgerScores', { @@ -99,3 +99,22 @@ export const teamScoresView = sqliteView('teamScoresView').as((qb) => { .leftJoin(ledgerScores, eq(teams.id, ledgerScores.player)) .groupBy(teams.id); }); + +export const playerDetailsView = sqliteView('playerDetailsView').as((qb) => { + return qb + .select({ + playerId: players.id, + firstName: players.firstName, + lastName: players.lastName, + teamID: teams.id, + teamName: teams.name, + teamColor: teams.color, + divisionId: divisions.id, + eventId: events.id + }) + .from(players) + .innerJoin(teams, eq(players.team, teams.id)) + .innerJoin(divisions, eq(players.division, divisions.id)) + .leftJoin(eventAttributions, eq(players.id, eventAttributions.playerID)) + .leftJoin(events, eq(eventAttributions.eventID, events.id)); +}); diff --git a/src/lib/server/eventManager.ts b/src/lib/server/eventManager.ts new file mode 100644 index 0000000..6391a25 --- /dev/null +++ b/src/lib/server/eventManager.ts @@ -0,0 +1,64 @@ +import { EventEmitter } from 'node:events'; +import { db } from '$lib/server/db'; +import * as schema from '$lib/server/db/schema'; + +let testScore = 0; + +// Emitter that emits +export const globalEmitter = new EventEmitter(); + +// Increment score for testing (remove ts) +const increment = () => { + testScore++; + console.log('score incremented', testScore); + globalEmitter.emit('scoreUpdate'); +}; + +// Increment scores when there is an emit +globalEmitter.on('incrementScores', increment); + +// Get teams object from database +export async function getTeams() { + const allTeams = await db.select().from(schema.teamScoresView); + return { + teams: allTeams.map((team) => ({ + name: team.teamName, + color: team.teamColor, + points: team.totalPoints || testScore + })) + }; +} + +export async function getPlayers() { + // 1. Fetch the view records, divisions, and events all at once + const [allPlayers, allDivisions, allEvents] = await Promise.all([ + db.select().from(schema.playerDetailsView), + db.select().from(schema.divisions), + db.select().from(schema.events) + ]); + + // 2. Build quick key/value lookup maps for IDs to names + const divisionMap = new Map(allDivisions.map((d) => [d.id, d.name])); + const eventMap = new Map(allEvents.map((e) => [e.id, e.name])); + + // 3. Return your original cleanly mapped data structure + return { + teams: allPlayers.map((player) => ({ + ID: player.playerId, + firstName: player.firstName, + lastName: player.lastName, + teamID: player.teamID, + teamName: player.teamName, + teamColor: player.teamColor, + + // Map division name safely + divisionName: player.divisionId + ? divisionMap.get(player.divisionId) || 'Unknown Division' + : 'No Division', + + // Map event name safely (fixing the team name leak!) + eventName: player.eventId ? eventMap.get(player.eventId) || 'No Event' : 'No Event', + eventID: player.eventId + })) + }; +} diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 9679719..b295611 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,28 +1,6 @@ -import { db } from '$lib/server/db'; -import * as schema from '$lib/server/db/schema'; -import type { Actions } from './$types'; +import * as eventManager from '$lib/server/eventManager'; +// Literally only here so that the frontend has the right structure export const load = async () => { - return await getTeams(); + return await eventManager.getTeams(); }; - -export const actions = { - addEntry: async (event) => { - console.log('something'); - } -} satisfies Actions; - -let testScore = 0; - -export async function getTeams() { - const allTeams = await db.select().from(schema.teamScoresView); - console.log(allTeams); - return { - teams: allTeams.map((team) => ({ - ...team, - name: team.teamName, - color: team.teamColor, - points: team.totalPoints || testScore - })) - }; -} diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 2500c2e..75ed21f 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,17 +1,62 @@ -
+ scoreEndpoint?.close()} /> + +
{#each leaderboard as house (house.name)}
{house.name}

{house.points}

@@ -19,7 +64,17 @@ {/each}
-
+