Skip to content

Commit 8ee7e94

Browse files
authored
fix(leaderboards): show correct rank in friends weekly leaderboard (@fehmer) (monkeytypegame#7104)
1 parent 60fffb1 commit 8ee7e94

File tree

3 files changed

+52
-22
lines changed

3 files changed

+52
-22
lines changed

backend/__tests__/api/controllers/leaderboard.spec.ts

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,10 +1265,13 @@ describe("Loaderboard Controller", () => {
12651265
describe("get xp weekly leaderboard rank", () => {
12661266
const getXpWeeklyLeaderboardMock = vi.spyOn(WeeklyXpLeaderboard, "get");
12671267
const getRankMock = vi.fn();
1268+
const getFriendsUidsMock = vi.spyOn(ConnectionsDal, "getFriendsUids");
12681269

12691270
beforeEach(async () => {
1270-
getXpWeeklyLeaderboardMock.mockClear();
1271-
getRankMock.mockClear();
1271+
[getXpWeeklyLeaderboardMock, getRankMock, getFriendsUidsMock].forEach(
1272+
(it) => it.mockClear()
1273+
);
1274+
12721275
await weeklyLeaderboardEnabled(true);
12731276
vi.useFakeTimers();
12741277
vi.setSystemTime(1722606812000);
@@ -1313,25 +1316,13 @@ describe("Loaderboard Controller", () => {
13131316

13141317
expect(getXpWeeklyLeaderboardMock).toHaveBeenCalledWith(lbConf, -1);
13151318

1316-
expect(getRankMock).toHaveBeenCalledWith(uid, lbConf);
1319+
expect(getRankMock).toHaveBeenCalledWith(uid, lbConf, undefined);
13171320
});
13181321

13191322
it("should get for last week", async () => {
13201323
//GIVEN
13211324
const lbConf = (await configuration).leaderboards.weeklyXp;
1322-
1323-
const resultData: XpLeaderboardEntry = {
1324-
totalXp: 100,
1325-
rank: 1,
1326-
timeTypedSeconds: 100,
1327-
uid: "user1",
1328-
name: "user1",
1329-
discordId: "discordId",
1330-
discordAvatar: "discordAvatar",
1331-
lastActivityTimestamp: 1000,
1332-
};
1333-
1334-
getRankMock.mockResolvedValue(resultData);
1325+
getRankMock.mockResolvedValue({});
13351326

13361327
//WHEN
13371328
const { body } = await mockApp
@@ -1343,15 +1334,41 @@ describe("Loaderboard Controller", () => {
13431334
//THEN
13441335
expect(body).toEqual({
13451336
message: "Weekly xp leaderboard rank retrieved",
1346-
data: resultData,
1337+
data: {},
13471338
});
13481339

13491340
expect(getXpWeeklyLeaderboardMock).toHaveBeenCalledWith(
13501341
lbConf,
13511342
1721606400000
13521343
);
13531344

1354-
expect(getRankMock).toHaveBeenCalledWith(uid, lbConf);
1345+
expect(getRankMock).toHaveBeenCalledWith(uid, lbConf, undefined);
1346+
});
1347+
1348+
it("should get for friendsOnly", async () => {
1349+
//GIVEN
1350+
const lbConf = (await configuration).leaderboards.weeklyXp;
1351+
await enableConnectionsFeature(true);
1352+
getRankMock.mockResolvedValue({});
1353+
const friends = ["friendOne", "friendTwo"];
1354+
getFriendsUidsMock.mockResolvedValue(friends);
1355+
1356+
//WHEN
1357+
const { body } = await mockApp
1358+
.get("/leaderboards/xp/weekly/rank")
1359+
.query({ friendsOnly: true })
1360+
.set("Authorization", `Bearer ${uid}`)
1361+
.expect(200);
1362+
1363+
//THEN
1364+
expect(body).toEqual({
1365+
message: "Weekly xp leaderboard rank retrieved",
1366+
data: {},
1367+
});
1368+
1369+
expect(getXpWeeklyLeaderboardMock).toHaveBeenCalledWith(lbConf, -1);
1370+
1371+
expect(getRankMock).toHaveBeenCalledWith(uid, lbConf, friends);
13551372
});
13561373

13571374
it("fails if daily leaderboards are disabled", async () => {

backend/src/api/controllers/leaderboard.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,15 +248,24 @@ export async function getWeeklyXpLeaderboard(
248248
export async function getWeeklyXpLeaderboardRank(
249249
req: MonkeyRequest<GetWeeklyXpLeaderboardRankQuery>
250250
): Promise<GetWeeklyXpLeaderboardRankResponse> {
251+
const { friendsOnly } = req.query;
251252
const { uid } = req.ctx.decodedToken;
253+
const connectionsConfig = req.ctx.configuration.connections;
254+
255+
const friendUids = await getFriendsUids(
256+
uid,
257+
friendsOnly === true,
258+
connectionsConfig
259+
);
252260

253261
const weeklyXpLeaderboard = getWeeklyXpLeaderboardWithError(
254262
req.ctx.configuration.leaderboards.weeklyXp,
255263
req.query.weeksBefore
256264
);
257265
const rankEntry = await weeklyXpLeaderboard.getRank(
258266
uid,
259-
req.ctx.configuration.leaderboards.weeklyXp
267+
req.ctx.configuration.leaderboards.weeklyXp,
268+
friendUids
260269
);
261270

262271
return new MonkeyResponse("Weekly xp leaderboard rank retrieved", rankEntry);

frontend/src/ts/pages/leaderboards.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -766,9 +766,13 @@ function fillUser(): void {
766766
}
767767

768768
const userData = state.userData;
769-
const percentile = (userData.rank / state.count) * 100;
769+
const rank = state.friendsOnly
770+
? (userData.friendsRank as number)
771+
: userData.rank;
772+
const percentile = (rank / state.count) * 100;
773+
770774
let percentileString = `Top ${percentile.toFixed(2)}%`;
771-
if (userData.rank === 1) {
775+
if (rank === 1) {
772776
percentileString = "GOAT";
773777
}
774778

@@ -805,7 +809,7 @@ function fillUser(): void {
805809
};
806810

807811
const html = `
808-
<div class="rank">${formatRank(userData.rank)}</div>
812+
<div class="rank">${formatRank(rank)}</div>
809813
<div class="userInfo">
810814
<div class="top">You (${percentileString})</div>
811815
<div class="bottom">${diffText}</div>

0 commit comments

Comments
 (0)