From 76a09e5bced70f9ef2f133ac17c94deb0bd49b4c Mon Sep 17 00:00:00 2001 From: pallavijha1709 Date: Fri, 17 Jul 2026 01:51:45 +0530 Subject: [PATCH] Add leaderboard ranking module --- src/lib/leaderboard/leaderboard.ts | 38 ++++++++++++++++++++++++++++ src/lib/leaderboard/seedData.ts | 40 ++++++++++++++++++++++++++++++ src/lib/leaderboard/service.ts | 6 +++++ src/lib/leaderboard/test.ts | 11 ++++++++ src/lib/leaderboard/types.ts | 14 +++++++++++ 5 files changed, 109 insertions(+) create mode 100644 src/lib/leaderboard/leaderboard.ts create mode 100644 src/lib/leaderboard/seedData.ts create mode 100644 src/lib/leaderboard/service.ts create mode 100644 src/lib/leaderboard/test.ts create mode 100644 src/lib/leaderboard/types.ts diff --git a/src/lib/leaderboard/leaderboard.ts b/src/lib/leaderboard/leaderboard.ts new file mode 100644 index 0000000..ba5ab7e --- /dev/null +++ b/src/lib/leaderboard/leaderboard.ts @@ -0,0 +1,38 @@ +import type { + LeaderboardEntry, + Member, +} from "./types"; + +export function generateLeaderboard( + members: Member[], +): LeaderboardEntry[] { + const sortedMembers = [...members].sort( + (a, b) => b.totalPoints - a.totalPoints, + ); + + const leaderboard: LeaderboardEntry[] = []; + + let currentRank = 1; + let previousPoints: number | null = null; + + for (const member of sortedMembers) { + if ( + previousPoints !== null && + member.totalPoints < previousPoints + ) { + currentRank++; + } + + leaderboard.push({ + rank: currentRank, + id: member.id, + name: member.name, + domain: member.domain, + totalPoints: member.totalPoints, + }); + + previousPoints = member.totalPoints; + } + + return leaderboard; +} \ No newline at end of file diff --git a/src/lib/leaderboard/seedData.ts b/src/lib/leaderboard/seedData.ts new file mode 100644 index 0000000..73d9436 --- /dev/null +++ b/src/lib/leaderboard/seedData.ts @@ -0,0 +1,40 @@ +import type { Member } from "./types"; + +export const members: Member[] = [ + { + id: 1, + name: "Alice", + domain: "Tech", + totalPoints: 200, + }, + { + id: 2, + name: "Bob", + domain: "Design", + totalPoints: 150, + }, + { + id: 3, + name: "Charlie", + domain: "Content", + totalPoints: 150, + }, + { + id: 4, + name: "David", + domain: "Tech", + totalPoints: 100, + }, + { + id: 5, + name: "Eva", + domain: "Design", + totalPoints: 100, + }, + { + id: 6, + name: "Frank", + domain: "Marketing", + totalPoints: 60, + }, +]; \ No newline at end of file diff --git a/src/lib/leaderboard/service.ts b/src/lib/leaderboard/service.ts new file mode 100644 index 0000000..325cab6 --- /dev/null +++ b/src/lib/leaderboard/service.ts @@ -0,0 +1,6 @@ +import { generateLeaderboard } from "./leaderboard"; +import { members } from "./seedData"; + +export async function runLeaderboard() { + return generateLeaderboard(members); +} \ No newline at end of file diff --git a/src/lib/leaderboard/test.ts b/src/lib/leaderboard/test.ts new file mode 100644 index 0000000..21c58cd --- /dev/null +++ b/src/lib/leaderboard/test.ts @@ -0,0 +1,11 @@ +import { runLeaderboard } from "./service"; + +const leaderboard = await runLeaderboard(); + +console.log( + JSON.stringify( + leaderboard, + null, + 2, + ), +); \ No newline at end of file diff --git a/src/lib/leaderboard/types.ts b/src/lib/leaderboard/types.ts new file mode 100644 index 0000000..5409a37 --- /dev/null +++ b/src/lib/leaderboard/types.ts @@ -0,0 +1,14 @@ +export type Member = { + id: number; + name: string; + domain: string; + totalPoints: number; +}; + +export type LeaderboardEntry = { + rank: number; + id: number; + name: string; + domain: string; + totalPoints: number; +}; \ No newline at end of file