177 lines
4.8 KiB
TypeScript
177 lines
4.8 KiB
TypeScript
import { db } from '$lib/server/db';
|
|
import { eq } from 'drizzle-orm';
|
|
import * as schema from '$lib/server/db/schema';
|
|
import { globalEmitter } from './globalEmitter';
|
|
|
|
// Initial data for page load
|
|
export async function getAllInitialInfo() {
|
|
return {
|
|
teams: await getTeams(),
|
|
events: await getRegisteredEvents()
|
|
};
|
|
}
|
|
|
|
// Fetch teams with optional filter
|
|
export async function getTeams(teamId?: number) {
|
|
const allTeams = await db
|
|
.select()
|
|
.from(schema.teamScoresView)
|
|
.where(teamId ? eq(schema.teamScoresView.teamId, teamId) : undefined);
|
|
for (let team in allTeams) {
|
|
let currentTeam = allTeams[team];
|
|
if (!currentTeam.totalPoints) {
|
|
currentTeam.totalPoints = 0;
|
|
}
|
|
}
|
|
return {
|
|
teams: allTeams.map((team) => ({
|
|
name: team.teamName,
|
|
color: team.teamColor,
|
|
points: team.totalPoints
|
|
}))
|
|
};
|
|
}
|
|
|
|
// Fetch registered events with optional filter
|
|
export async function getRegisteredEvents(eventId?: number) {
|
|
async function getWinnerInfo(teamId: number) {
|
|
const teamInfo = await getTeams(teamId);
|
|
return teamInfo.teams[0];
|
|
}
|
|
|
|
async function getScoringPreset(presetId: number) {
|
|
const presets = await db
|
|
.select()
|
|
.from(schema.scoringPresets)
|
|
.where(presetId ? eq(schema.scoringPresets.presetID, presetId) : undefined);
|
|
return presets;
|
|
}
|
|
|
|
const allEvents = await db
|
|
.select()
|
|
.from(schema.registeredEventsView)
|
|
.where(eventId ? eq(schema.registeredEventsView.eventId, eventId) : undefined);
|
|
|
|
const events = await Promise.all(
|
|
allEvents.map(async (events) => ({
|
|
id: events.eventId,
|
|
name: events.eventName,
|
|
division: events.division,
|
|
state: events.state,
|
|
completed: events.timeCompleted || 0,
|
|
resultPreset: events.resultPreset,
|
|
scoringPreset: events.scorePreset ? await getScoringPreset(events.scorePreset) : 'UNDECIDED',
|
|
winner: events.winner ? await getWinnerInfo(events.winner) : 'UNDECIDED'
|
|
}))
|
|
);
|
|
|
|
return { events };
|
|
}
|
|
|
|
export async function startEvent(eventId: number) {
|
|
let event = await db
|
|
.select()
|
|
.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;
|
|
} else {
|
|
let replacedEvent = await db
|
|
.update(schema.registeredEvents)
|
|
.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) {
|
|
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,
|
|
schema.registeredEventPlayersView.teamName
|
|
);
|
|
return {
|
|
eventPlayers: eventPlayers.map((players) => ({
|
|
id: players.playerId,
|
|
firstName: players.firstName,
|
|
lastName: players.lastName,
|
|
registeredPlayerId: players.registeredPlayerId,
|
|
placement: players.placement,
|
|
bracket: players.bracket,
|
|
eventId: players.eventId,
|
|
eventName: players.eventName,
|
|
teamId: players.teamId,
|
|
teamName: players.teamName,
|
|
teamColor: players.teamColor
|
|
}))
|
|
};
|
|
}
|
|
|
|
export async function getAllBrackets() {
|
|
const brackets = await db.select().from(schema.brackets);
|
|
|
|
return {
|
|
brackets: brackets
|
|
};
|
|
}
|
|
|
|
export async function getPlayerInfo(playerId: number) {
|
|
const playerInfo = await db.select().from(schema.players).where(eq(schema.players.id), playerId);
|
|
return playerInfo;
|
|
}
|
|
|
|
export async function getResultPreset(presetId?: number) {
|
|
const resultPresets = await db
|
|
.select()
|
|
.from(schema.resultPresets)
|
|
.where(presetId ? eq(schema.resultPresets.id, presetId) : undefined);
|
|
|
|
return {
|
|
resultPresets: resultPresets
|
|
};
|
|
}
|
|
|
|
// Merge events, players, brackets, and presets into a frontend-ready structure
|
|
export async function getRegisteredEventsWithPlayers(eventId?: number) {
|
|
let newEvents = await getRegisteredEvents(eventId);
|
|
let registeredEventList = newEvents['events'];
|
|
|
|
let brackets = await getAllBrackets();
|
|
|
|
let fullEventList: any[] = [];
|
|
|
|
for (let registeredEvent in registeredEventList) {
|
|
let event = registeredEventList[registeredEvent];
|
|
let resultPreset = await getResultPreset(event.resultPreset);
|
|
let registeredPlayers = await getAllRegisteredEventPlayers(event.id);
|
|
|
|
// Group players by bracket category for the frontend
|
|
const bracketOrder = brackets.brackets.map((category) => {
|
|
return {
|
|
...category,
|
|
items: registeredPlayers.eventPlayers.filter((item) => item.bracket === category.name)
|
|
};
|
|
});
|
|
|
|
let eventWithPlayers = {
|
|
...event,
|
|
registeredPlayers: bracketOrder,
|
|
...resultPreset
|
|
};
|
|
fullEventList.push(eventWithPlayers);
|
|
}
|
|
return fullEventList;
|
|
}
|