Skip to content

Commit 91bd24b

Browse files
committed
impr: integrate leaderboard purging on user ban
1 parent 3ac38d4 commit 91bd24b

3 files changed

Lines changed: 69 additions & 13 deletions

File tree

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

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import * as ReportDal from "../../../src/dal/report";
88
import * as LogsDal from "../../../src/dal/logs";
99
import GeorgeQueue from "../../../src/queues/george-queue";
1010
import * as AuthUtil from "../../../src/utils/auth";
11+
import * as DailyLeaderboards from "../../../src/utils/daily-leaderboards";
12+
import * as WeeklyXpLeaderboard from "../../../src/services/weekly-xp-leaderboard";
1113

1214
import { enableRateLimitExpects } from "../../__testData__/rate-limit";
1315
import Test from "supertest/lib/test";
@@ -66,12 +68,26 @@ describe("AdminController", () => {
6668
const userBannedMock = vi.spyOn(UserDal, "setBanned");
6769
const georgeBannedMock = vi.spyOn(GeorgeQueue, "userBanned");
6870
const getUserMock = vi.spyOn(UserDal, "getPartialUser");
71+
const purgeUserFromDailyLeaderboardsMock = vi.spyOn(
72+
DailyLeaderboards,
73+
"purgeUserFromDailyLeaderboards",
74+
);
75+
const purgeUserFromXpLeaderboardsMock = vi.spyOn(
76+
WeeklyXpLeaderboard,
77+
"purgeUserFromXpLeaderboards",
78+
);
6979

7080
beforeEach(() => {
71-
[userBannedMock, georgeBannedMock, getUserMock].forEach((it) =>
72-
it.mockClear(),
73-
);
81+
[
82+
userBannedMock,
83+
georgeBannedMock,
84+
getUserMock,
85+
purgeUserFromDailyLeaderboardsMock,
86+
purgeUserFromXpLeaderboardsMock,
87+
].forEach((it) => it.mockClear());
7488
userBannedMock.mockResolvedValue();
89+
purgeUserFromDailyLeaderboardsMock.mockResolvedValue();
90+
purgeUserFromXpLeaderboardsMock.mockResolvedValue();
7591
});
7692

7793
it("should ban user with discordId", async () => {
@@ -101,6 +117,14 @@ describe("AdminController", () => {
101117
]);
102118
expect(userBannedMock).toHaveBeenCalledWith(victimUid, true);
103119
expect(georgeBannedMock).toHaveBeenCalledWith("discordId", true);
120+
expect(purgeUserFromDailyLeaderboardsMock).toHaveBeenCalledWith(
121+
victimUid,
122+
(await configuration).dailyLeaderboards,
123+
);
124+
expect(purgeUserFromXpLeaderboardsMock).toHaveBeenCalledWith(
125+
victimUid,
126+
(await configuration).leaderboards.weeklyXp,
127+
);
104128
});
105129
it("should unban user without discordId", async () => {
106130
//GIVEN
@@ -128,6 +152,8 @@ describe("AdminController", () => {
128152
]);
129153
expect(userBannedMock).toHaveBeenCalledWith(victimUid, false);
130154
expect(georgeBannedMock).not.toHaveBeenCalled();
155+
expect(purgeUserFromDailyLeaderboardsMock).not.toHaveBeenCalled();
156+
expect(purgeUserFromXpLeaderboardsMock).not.toHaveBeenCalled();
131157
});
132158
it("should fail without mandatory properties", async () => {
133159
//GIVEN

backend/src/api/controllers/admin.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import MonkeyError, { getErrorMessage } from "../../utils/error";
1616
import { Configuration } from "@monkeytype/schemas/configuration";
1717
import { addImportantLog } from "../../dal/logs";
1818
import { MonkeyRequest } from "../types";
19+
import { purgeUserFromDailyLeaderboards } from "../../utils/daily-leaderboards";
20+
import { purgeUserFromXpLeaderboards } from "../../services/weekly-xp-leaderboard";
1921

2022
export async function test(_req: MonkeyRequest): Promise<MonkeyResponse> {
2123
return new MonkeyResponse("OK", null);
@@ -33,13 +35,28 @@ export async function toggleBan(
3335
const discordId = user.discordId;
3436
const discordIdIsValid = discordId !== undefined && discordId !== "";
3537

36-
await UserDAL.setBanned(uid, !user.banned);
37-
if (discordIdIsValid) await GeorgeQueue.userBanned(discordId, !user.banned);
38+
const banning = !user.banned;
39+
40+
await UserDAL.setBanned(uid, banning);
41+
if (discordIdIsValid) await GeorgeQueue.userBanned(discordId, banning);
42+
43+
if (banning) {
44+
await Promise.all([
45+
purgeUserFromDailyLeaderboards(
46+
uid,
47+
req.ctx.configuration.dailyLeaderboards,
48+
),
49+
purgeUserFromXpLeaderboards(
50+
uid,
51+
req.ctx.configuration.leaderboards.weeklyXp,
52+
),
53+
]);
54+
}
3855

39-
void addImportantLog("user_ban_toggled", { banned: !user.banned }, uid);
56+
void addImportantLog("user_ban_toggled", { banned: banning }, uid);
4057

4158
return new MonkeyResponse(`Ban toggled`, {
42-
banned: !user.banned,
59+
banned: banning,
4360
});
4461
}
4562

backend/src/api/controllers/result.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ import {
2323
incrementDailyLeaderboard,
2424
} from "../../utils/prometheus";
2525
import GeorgeQueue from "../../queues/george-queue";
26-
import { getDailyLeaderboard } from "../../utils/daily-leaderboards";
26+
import {
27+
getDailyLeaderboard,
28+
purgeUserFromDailyLeaderboards,
29+
} from "../../utils/daily-leaderboards";
2730
import * as UserDAL from "../../dal/user";
2831
import { buildMonkeyMail } from "../../utils/monkey-mail";
2932
import * as WeeklyXpLeaderboard from "../../services/weekly-xp-leaderboard";
@@ -386,11 +389,21 @@ export async function addResult(
386389
subject: "Banned",
387390
body: "Your account has been automatically banned for triggering the anticheat system. If you believe this is a mistake, please contact support.",
388391
});
389-
await UserDAL.addToInbox(
390-
uid,
391-
[mail],
392-
req.ctx.configuration.users.inbox,
393-
);
392+
await Promise.all([
393+
UserDAL.addToInbox(
394+
uid,
395+
[mail],
396+
req.ctx.configuration.users.inbox,
397+
),
398+
purgeUserFromDailyLeaderboards(
399+
uid,
400+
req.ctx.configuration.dailyLeaderboards,
401+
),
402+
WeeklyXpLeaderboard.purgeUserFromXpLeaderboards(
403+
uid,
404+
req.ctx.configuration.leaderboards.weeklyXp,
405+
),
406+
]);
394407
user.banned = true;
395408
}
396409
}

0 commit comments

Comments
 (0)