had opencode clean up all my nonsense comments too
This commit is contained in:
@@ -1 +1 @@
|
||||
// place files you want to import through the `$lib` alias in this folder.
|
||||
// Place shared exports accessible via $lib alias here
|
||||
|
||||
@@ -34,13 +34,13 @@ export async function validateSessionToken(token: string) {
|
||||
|
||||
if (!row) return { session: null, user: null };
|
||||
|
||||
// Expired — clean up and reject
|
||||
// Session expired, delete it
|
||||
if (Date.now() >= row.session.expiresAt.getTime()) {
|
||||
await db.delete(sessions).where(eq(sessions.id, sessionId));
|
||||
return { session: null, user: null };
|
||||
}
|
||||
|
||||
// Sliding expiration: renew if past the halfway mark
|
||||
// Renew session if past the halfway point
|
||||
if (Date.now() >= row.session.expiresAt.getTime() - DAY_MS * 15) {
|
||||
const newExpiresAt = new Date(Date.now() + DAY_MS * 30);
|
||||
await db.update(sessions).set({ expiresAt: newExpiresAt }).where(eq(sessions.id, sessionId));
|
||||
@@ -59,7 +59,7 @@ export function setSessionTokenCookie(event: RequestEvent, token: string, expire
|
||||
expires: expiresAt,
|
||||
path: '/',
|
||||
httpOnly: true,
|
||||
secure: !import.meta.env.DEV, // allow http in local dev
|
||||
secure: !import.meta.env.DEV,
|
||||
sameSite: 'lax'
|
||||
});
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ import { eq } from 'drizzle-orm';
|
||||
import * as schema from '$lib/server/db/schema';
|
||||
import { globalEmitter } from './globalEmitter';
|
||||
|
||||
// For page.server.ts so that it doesnt look weird before loading
|
||||
// Initial data for page load
|
||||
export async function getAllInitialInfo() {
|
||||
return {
|
||||
teams: await getTeams(),
|
||||
@@ -11,7 +11,7 @@ export async function getAllInitialInfo() {
|
||||
};
|
||||
}
|
||||
|
||||
// Get teams object from database
|
||||
// Fetch teams with optional filter
|
||||
export async function getTeams(teamId?: number) {
|
||||
const allTeams = await db
|
||||
.select()
|
||||
@@ -32,7 +32,7 @@ export async function getTeams(teamId?: number) {
|
||||
};
|
||||
}
|
||||
|
||||
// Get all registered events from database
|
||||
// Fetch registered events with optional filter
|
||||
export async function getRegisteredEvents(eventId?: number) {
|
||||
async function getWinnerInfo(teamId: number) {
|
||||
const teamInfo = await getTeams(teamId);
|
||||
@@ -90,12 +90,12 @@ export async function startEvent(eventId: number) {
|
||||
}
|
||||
}
|
||||
|
||||
// Get all players with an event id specified
|
||||
// Fetch all players registered for a specific event
|
||||
export async function getAllRegisteredEventPlayers(eventId: number) {
|
||||
const eventPlayers = await db
|
||||
.select()
|
||||
.from(schema.registeredEventPlayersView)
|
||||
// where the registered player is registered for that event
|
||||
// Filter by event ID
|
||||
.where(eq(schema.registeredEventPlayersView.eventId, eventId))
|
||||
.orderBy(
|
||||
schema.registeredEventPlayersView.bracket,
|
||||
@@ -138,48 +138,34 @@ export async function getResultPreset(presetId?: number) {
|
||||
};
|
||||
}
|
||||
|
||||
// Moved the function the registeredEvents endpoint
|
||||
// Just merges the results of the previous 3 functions into a standard format
|
||||
// Merge events, players, brackets, and presets into a frontend-ready structure
|
||||
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
|
||||
// Group players by bracket category 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;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ export const scorers = sqliteTable('users', {
|
||||
});
|
||||
|
||||
export const sessions = sqliteTable('sessions', {
|
||||
id: text('id').primaryKey(), // SHA-256 hash of the token, never the raw token
|
||||
id: text('id').primaryKey(),
|
||||
userId: text('user_id')
|
||||
.notNull()
|
||||
.references(() => scorers.id),
|
||||
|
||||
@@ -13,33 +13,26 @@
|
||||
let containerRef = $state<HTMLDivElement | null>(null);
|
||||
let activeId = $state<string | number | null>(null);
|
||||
|
||||
/**
|
||||
* Public function to scroll a specific row into the center of the viewport.
|
||||
* Can be called manually by the parent component.
|
||||
*/
|
||||
/** Scroll a specific row to the center of the viewport */
|
||||
export function scrollToId(id: string | number) {
|
||||
if (!containerRef) return;
|
||||
|
||||
const targetRow = containerRef.querySelector(`#row-${id}`) as HTMLElement | null;
|
||||
if (targetRow) {
|
||||
// Update local state to highlight the centered row
|
||||
activeId = id;
|
||||
|
||||
// Calculate the midpoint math to center the row
|
||||
const rowOffsetTop = targetRow.offsetTop;
|
||||
const rowHeight = targetRow.offsetHeight;
|
||||
const containerHeight = containerRef.clientHeight;
|
||||
|
||||
// Target = Row position - (half of container space) + (half of row height adjustment)
|
||||
const centerScrollTarget = rowOffsetTop - containerHeight / 2 + rowHeight / 2;
|
||||
|
||||
// Using behavior: 'auto' for an instantaneous snap instead of smooth scrolling
|
||||
containerRef.scrollTo({
|
||||
top: centerScrollTarget,
|
||||
behavior: 'auto'
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<div bind:this={containerRef} class="table-container" style="max-height: {maxHeight};">
|
||||
|
||||
@@ -10,7 +10,7 @@ export const fitText: Action<HTMLElement> = (node) => {
|
||||
node.style.transformOrigin = 'top left';
|
||||
node.style.transform = 'none';
|
||||
|
||||
// Step 1: fit to height
|
||||
// Fit font size to container height
|
||||
let size = 1;
|
||||
node.style.fontSize = size + 'px';
|
||||
while (node.scrollHeight <= container!.clientHeight) {
|
||||
@@ -19,7 +19,7 @@ export const fitText: Action<HTMLElement> = (node) => {
|
||||
}
|
||||
node.style.fontSize = size - 1 + 'px';
|
||||
|
||||
// Step 2: stretch width to fill container
|
||||
// Stretch width to fill container
|
||||
const scaleX = container!.clientWidth / node.scrollWidth;
|
||||
node.style.transform = `scaleX(${scaleX})`;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user