diff --git a/src/lib/server/cacheManager.ts b/src/lib/server/cacheManager.ts new file mode 100644 index 0000000..2f40972 --- /dev/null +++ b/src/lib/server/cacheManager.ts @@ -0,0 +1,24 @@ +import * as database from './databaseManager.ts'; +import { globalEmitter } from './databaseManager.ts'; + +// TODO Implement caching of info at some point +// structure: +// databaseManager gets raw data from backend +// stored in variables in cacheManager +// sent to frontend using same function names in dataManager (not made) + +let teamsCache; + +export async function updateTeamsCache() { + teamsCache = database.getTeams(); +} + +globalEmitter.on('invalTeamsCache', updateTeamsCache); + +let eventsCache; + +export async function updateEventsCache() { + eventsCache = database.getRegisteredEvents(); +} + +globalEmitter.on('invalEventsCache', updateEventsCache); diff --git a/src/lib/server/eventManager.ts b/src/lib/server/databaseManager.ts similarity index 50% rename from src/lib/server/eventManager.ts rename to src/lib/server/databaseManager.ts index 4d9b5b9..0b61801 100644 --- a/src/lib/server/eventManager.ts +++ b/src/lib/server/databaseManager.ts @@ -43,15 +43,21 @@ export async function getTeams() { } // Get all registered events from database -export async function getRegisteredEvents() { - const allEvents = await db.select().from(schema.registeredEventsView); +export async function getRegisteredEvents(eventId?: number) { + console.log('eventId: ', eventId); + const allEvents = await db + .select() + .from(schema.registeredEventsView) + // If event id specified, get that event, otherwise get all events + .where(eventId ? eq(schema.registeredEventsView.eventId, eventId) : undefined); return { events: allEvents.map((events) => ({ id: events.eventId, name: events.eventName, division: events.division, state: events.state, - completed: events.timeCompleted || 0 + completed: events.timeCompleted || 0, + resultPreset: events.resultPreset })) }; } @@ -61,6 +67,7 @@ export async function getAllRegisteredEventPlayers(eventId: number) { const eventPlayers = await db .select() .from(schema.registeredEventPlayersView) + // where the registered player is registered for that event .where(eq(schema.registeredEventPlayersView.eventId, eventId)) .orderBy( schema.registeredEventPlayersView.bracket, @@ -90,3 +97,60 @@ export async function getAllBrackets() { brackets: brackets }; } + +export async function getResultPreset(presetId: number) { + const resultPresets = await db + .select() + .from(schema.resultPresets) + .where(eq(schema.resultPresets.id, presetId)); + + return { + resultPresets: resultPresets + }; +} + +// Moved the function the registeredEvents endpoint +// Just merges the results of the previous 3 functions into a standard format +export async function getRegisteredEventsWithPlayers(eventId?: number) { + // Get updated events from database + let newEvents = await getRegisteredEvents(eventId); + let registeredEventList = newEvents['events']; + + // Get all possible brackets from the database + let brackets = await getAllBrackets(); + + // Initilise the final eventList + let fullEventList: any[] = []; + + // For every event + for (let registeredEvent in registeredEventList) { + let event = registeredEventList[registeredEvent]; + + // Get the info about the result preset for the ui + let resultPreset = await getResultPreset(event.resultPreset); + + // Get all players for the event + let registeredPlayers = await getAllRegisteredEventPlayers(event.id); + + // Map the players into an [] with structure {id: number, name: string, items: any[]} + // So that the players are sorted by bracket for the frontend + const bracketOrder = brackets.brackets.map((category) => { + return { + ...category, + // Filter the items that match the current bracket name + items: registeredPlayers.eventPlayers.filter((item) => item.bracket === category.name) + }; + }); + + // append the player info and result preset to the event object + let eventWithPlayers = { + ...event, + registeredPlayers: bracketOrder, + ...resultPreset + }; + // combine all of the events into one array + fullEventList.push(eventWithPlayers); + } + // Send to client + return fullEventList; +} diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index 731f48c..156f4e6 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,4 +1,4 @@ -import { getAllInitialInfo } from '$lib/server/eventManager'; +import { getAllInitialInfo } from '$lib/server/databaseManager'; // Literally only here so that the frontend has the right structure export const load = async () => { diff --git a/src/routes/api/registeredPlayers/+server.ts b/src/routes/api/registeredPlayers/+server.ts index 9937c6d..c3d3fd1 100644 --- a/src/routes/api/registeredPlayers/+server.ts +++ b/src/routes/api/registeredPlayers/+server.ts @@ -1,4 +1,4 @@ -import { globalEmitter, getAllRegisteredEventPlayers } from '$lib/server/eventManager'; +import { globalEmitter, getAllRegisteredEventPlayers } from '$lib/server/databaseManager'; import { generateEndpoint } from '$lib/server/endpoint'; // Expose post request diff --git a/src/routes/api/teams/+server.ts b/src/routes/api/teams/+server.ts index 001c85f..0115f41 100644 --- a/src/routes/api/teams/+server.ts +++ b/src/routes/api/teams/+server.ts @@ -1,4 +1,4 @@ -import { globalEmitter, getTeams } from '$lib/server/eventManager'; +import { globalEmitter, getTeams } from '$lib/server/databaseManager'; import { generateEndpoint } from '$lib/server/endpoint'; // Expose post request