feat: implement leaderboard page with top players, teams, and high scores

- Added a new leaderboard route with server-side loading for top players, teams, and recent high scores.
- Created a new Svelte component for the leaderboard UI, including tabs for players, teams, and scores.
- Implemented ELO ranking display and win/loss statistics for players.
- Added functionality to display team wins and member counts.
- Included recent high scores with player context and map details.
- Enhanced team management features in the teams route, including renaming and member management with permission checks.
This commit is contained in:
2026-02-28 18:18:11 +01:00
parent fb9140a03f
commit b506dba0eb
285 changed files with 1184 additions and 47362 deletions

View File

@@ -1,4 +1,3 @@
// src/hooks.server.ts
import type { Handle } from '@sveltejs/kit';
import { building } from '$app/environment';
import { auth } from '$lib/server/auth';
@@ -6,6 +5,7 @@ import { svelteKitHandler } from 'better-auth/svelte-kit';
import { db } from '$lib/server/db';
import { user as userTable } from '$lib/server/db/auth.schema';
import { eq } from 'drizzle-orm';
import { ensureRootAdminRole } from '$lib/server/permissions';
const handleBetterAuth: Handle = async ({ event, resolve }) => {
const session = await auth.api.getSession({ headers: event.request.headers });
@@ -18,9 +18,20 @@ const handleBetterAuth: Handle = async ({ event, resolve }) => {
where: eq(userTable.id, session.user.id)
});
let role = dbUser?.role ?? 'player';
// Auto-promote root admin if env var is set and they're not admin yet
if (dbUser) {
role = await ensureRootAdminRole({
id: dbUser.id,
email: dbUser.email,
role
});
}
event.locals.user = {
...session.user,
role: dbUser?.role ?? 'player'
role
};
}