diff --git a/src/lib/server/databaseManager.ts b/src/lib/server/databaseManager.ts index b9dac21..75e05f8 100644 --- a/src/lib/server/databaseManager.ts +++ b/src/lib/server/databaseManager.ts @@ -1,5 +1,5 @@ import { db } from '$lib/server/db'; -import { eq } from 'drizzle-orm'; +import { sql, eq, and } from 'drizzle-orm'; import * as schema from '$lib/server/db/schema'; import { globalEmitter } from './globalEmitter'; @@ -74,7 +74,6 @@ export async function startEvent(eventId: number) { .from(schema.registeredEventsView) .where(eq(schema.registeredEventsView.eventId, eventId)); let requestedEvent = event[0]; - console.log(requestedEvent); if (requestedEvent.state != 0) { console.log('not startable'); return false; @@ -84,26 +83,26 @@ export async function startEvent(eventId: number) { .set({ state: 1 }) .where(eq(schema.registeredEvents.id, requestedEvent.eventId)) .returning(); - console.log(replacedEvent); globalEmitter.emit('eventUpdate'); return true; } } // Fetch all players registered for a specific event -export async function getAllRegisteredEventPlayers(eventId: number) { +export async function getAllRegisteredEventPlayers(eventId: number, getScores?: boolean) { const eventPlayers = await db .select() .from(schema.registeredEventPlayersView) - // Filter by event ID .where(eq(schema.registeredEventPlayersView.eventId, eventId)) .orderBy( schema.registeredEventPlayersView.bracket, - schema.registeredEventPlayersView.placement, + sql`CASE WHEN ${schema.registeredEventPlayersView.placement} = 0 THEN 999999 ELSE ${schema.registeredEventPlayersView.placement} END ASC`, schema.registeredEventPlayersView.teamName ); - return { - eventPlayers: eventPlayers.map((players) => ({ + + // 1. Wrap the map in Promise.all and await it + const resolvedPlayers = await Promise.all( + eventPlayers.map(async (players) => ({ id: players.playerId, firstName: players.firstName, lastName: players.lastName, @@ -114,8 +113,14 @@ export async function getAllRegisteredEventPlayers(eventId: number) { eventName: players.eventName, teamId: players.teamId, teamName: players.teamName, - teamColor: players.teamColor + teamColor: players.teamColor, + playerScores: getScores == true ? await getPlayerScores(players.playerId, eventId) : undefined })) + ); + + // 2. Return the fully resolved data + return { + eventPlayers: resolvedPlayers }; } @@ -128,8 +133,40 @@ export async function getAllBrackets() { } export async function getPlayerInfo(playerId: number) { - const playerInfo = await db.select().from(schema.players).where(eq(schema.players.id), playerId); - return playerInfo; + const playerInfo = await db.select().from(schema.players).where(eq(schema.players.id, playerId)); + const teamInfo = await db + .select() + .from(schema.teams) + .where(eq(schema.teams.id, playerInfo[0].team)); + return { ...playerInfo[0], teamInfo: teamInfo[0] }; +} + +export async function getPlayerScores(playerId: number, eventId?: number) { + const playerRegistrations = await getPlayerRegistrations(playerId, eventId); + let scoresObject: any[] = []; + for (let registration in playerRegistrations) { + let currentReg = playerRegistrations[registration]; + let scores = await db + .select() + .from(schema.registeredResults) + .where(eq(schema.registeredResults.registeredPlayerId, currentReg.registeredPlayerId)); + scoresObject.push(...scores); + } + return scoresObject; +} + +export async function getPlayerRegistrations(playerId: number, eventId?: number) { + const playerRegistrations = await db + .select() + .from(schema.registeredEventPlayersView) + .where( + and( + eq(schema.registeredEventPlayersView.playerId, playerId), + eventId ? eq(schema.registeredEventPlayersView.eventId, eventId) : undefined + ) + ); + + return playerRegistrations; } export async function getResultPreset(presetId?: number) { @@ -155,7 +192,10 @@ export async function getRegisteredEventsWithPlayers(eventId?: number) { for (let registeredEvent in registeredEventList) { let event = registeredEventList[registeredEvent]; let resultPreset = await getResultPreset(event.resultPreset); - let registeredPlayers = await getAllRegisteredEventPlayers(event.id); + let registeredPlayers = await getAllRegisteredEventPlayers( + event.id, + eventId != undefined ? true : undefined + ); // Group players by bracket category for the frontend const bracketOrder = brackets.brackets.map((category) => { diff --git a/src/routes/api/eventResults/+server.ts b/src/routes/api/eventResults/+server.ts index 4a45290..3fe62f2 100644 --- a/src/routes/api/eventResults/+server.ts +++ b/src/routes/api/eventResults/+server.ts @@ -55,6 +55,19 @@ export async function POST({ request }: any) { teamScores.set(currentPlayerTeam, currentTeamScore + score); } + for (let result in currentPlayer.scores) { + let currentResult = currentPlayer.scores[result]; + let newScoreEntry = await db + .insert(schema.registeredResults) + .values({ + registeredPlayerId: currentPlayer.registeredPlayerId, + resultIndex: parseInt(result), + result: currentResult + }) + .returning(); + console.log(newScoreEntry); + } + // Update player placement in the database let newPlayerPlacement = await db .update(schema.registeredPlayers) diff --git a/src/routes/event/[eventId]/+page.server.ts b/src/routes/event/[eventId]/+page.server.ts new file mode 100644 index 0000000..a33c558 --- /dev/null +++ b/src/routes/event/[eventId]/+page.server.ts @@ -0,0 +1,14 @@ +import { eq } from 'drizzle-orm'; +import { db } from '$lib/server/db'; +import { scorers } from '$lib/server/db/schema'; +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ locals }) => { + if (!locals.user) return { user: null }; + + const [row] = await db + .select({ role: scorers.role }) + .from(scorers) + .where(eq(scorers.id, locals.user.id)); + return { user: { ...locals.user, role: row?.role ?? 'scorer' } }; +}; diff --git a/src/routes/event/[eventId]/+page.svelte b/src/routes/event/[eventId]/+page.svelte index 96fe2eb..db72b66 100644 --- a/src/routes/event/[eventId]/+page.svelte +++ b/src/routes/event/[eventId]/+page.svelte @@ -1,7 +1,7 @@ -