feat(leaderboard): add global rankings screen with solo/multi/all filters

This commit is contained in:
jessy-david-dev
2026-04-10 17:30:13 +02:00
parent 676e5ba756
commit aed510afd5
7 changed files with 279 additions and 2 deletions
+40
View File
@@ -0,0 +1,40 @@
import { NextResponse } from "next/server";
import { prisma } from "../../../lib/prisma";
export async function GET() {
const users = await prisma.user.findMany({
include: { games: true },
});
const rows = users
.map((u) => {
const all = u.games;
const solo = all.filter((g) => g.mode === "solo");
const multi = all.filter((g) => g.mode === "multi");
const wins = all.filter((g) => g.won);
const wonGames = all.filter((g) => g.won && g.clicks > 0);
const avgClicks = wonGames.length
? Math.round(wonGames.reduce((s, g) => s + g.clicks, 0) / wonGames.length)
: null;
const bestTime = wins.length
? Math.min(...wins.map((g) => g.timeSeconds))
: null;
return {
id: u.id,
name: u.name,
totalGames: all.length,
wins: wins.length,
soloGames: solo.length,
soloWins: solo.filter((g) => g.won).length,
multiGames: multi.length,
multiWins: multi.filter((g) => g.won).length,
avgClicks,
bestTime,
};
})
.filter((r) => r.totalGames > 0)
.sort((a, b) => b.wins - a.wins || b.totalGames - a.totalGames);
return NextResponse.json(rows);
}