had opencode clean up all my nonsense comments too

This commit is contained in:
2026-06-29 15:11:53 +01:00
parent 3be0033a32
commit 201821d53c
21 changed files with 77 additions and 163 deletions

View File

@@ -1 +1 @@
// place files you want to import through the `$lib` alias in this folder.
// Place shared exports accessible via $lib alias here

View File

@@ -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'
});
}

View File

@@ -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;
}

View File

@@ -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),

View File

@@ -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};">

View File

@@ -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})`;
}