fix: speedrun scores, dashboard icons, N+1 queries, typeof guards

This commit is contained in:
Jeremy Brandenburger
2026-03-31 09:05:33 +02:00
parent 2d27d9fe4d
commit 8a5d08b586
3 changed files with 66 additions and 57 deletions
+20 -6
View File
@@ -418,9 +418,15 @@ app.get('/api/dashboard', requireAuth, (req, res) => {
const userRow = db.prepare('SELECT elo FROM users WHERE username = ?').get(u);
const elo = userRow?.elo ?? 1000;
const onlineWithElo = [...userSockets.keys()].map(name => {
const row = db.prepare('SELECT elo FROM users WHERE username = ?').get(name);
return { name, elo: row?.elo ?? 1000, rank: eloRank(row?.elo ?? 1000) };
const onlineNames = [...userSockets.keys()];
const eloRows = onlineNames.length > 0
? db.prepare(`SELECT username, elo FROM users WHERE username IN (${onlineNames.map(() => '?').join(',')})`)
.all(...onlineNames)
: [];
const eloByUser = Object.fromEntries(eloRows.map(r => [r.username, r.elo]));
const onlineWithElo = onlineNames.map(name => {
const elo = eloByUser[name] ?? 1000;
return { name, elo, rank: eloRank(elo) };
});
res.json({
@@ -562,9 +568,17 @@ async function main() {
}
function broadcastLobbyUpdate() {
const online = [...userSockets.keys()].map(name => {
const row = db.prepare('SELECT elo FROM users WHERE username = ?').get(name);
return { name, elo: row?.elo ?? 1000, rank: eloRank(row?.elo ?? 1000) };
const onlineNames = [...userSockets.keys()];
const eloMap = onlineNames.length > 0
? Object.fromEntries(
db.prepare(`SELECT username, elo FROM users WHERE username IN (${onlineNames.map(() => '?').join(',')})`)
.all(...onlineNames)
.map(r => [r.username, r.elo])
)
: {};
const online = onlineNames.map(name => {
const elo = eloMap[name] ?? 1000;
return { name, elo, rank: eloRank(elo) };
});
wss.clients.forEach(ws => {
if (ws.readyState !== WebSocket.OPEN || !ws.userId) return;