diff --git a/backend/api/controllers/leaderboards.ts b/backend/api/controllers/leaderboards.ts index c565eb5ca..c8bc20370 100644 --- a/backend/api/controllers/leaderboards.ts +++ b/backend/api/controllers/leaderboards.ts @@ -17,7 +17,15 @@ class LeaderboardsController { queryLimit ); - const normalizedLeaderboard = _.map(leaderboard, (entry) => { + if (leaderboard === false) { + return new MonkeyResponse( + "Leaderboard is currently updating. Please try again in a few seconds.", + null, + 503 + ); + } + + const normalizedLeaderboard = _.map(leaderboard as any[], (entry) => { return uid && entry.uid === uid ? entry : _.omit(entry, ["discordId", "uid", "difficulty", "language"]); diff --git a/backend/dao/leaderboards.js b/backend/dao/leaderboards.js index f10ad9de3..a786f44bc 100644 --- a/backend/dao/leaderboards.js +++ b/backend/dao/leaderboards.js @@ -2,8 +2,11 @@ import db from "../init/db"; import Logger from "../utils/logger"; import { performance } from "perf_hooks"; +const leaderboardUpdating = {}; + class LeaderboardsDAO { static async get(mode, mode2, language, skip, limit = 50) { + if (leaderboardUpdating[`${language}_${mode}_${mode2}`]) return false; if (limit > 50 || limit <= 0) limit = 50; if (skip < 0) skip = 0; const preset = await db @@ -83,6 +86,7 @@ class LeaderboardsDAO { }); let end2 = performance.now(); let start3 = performance.now(); + leaderboardUpdating[`${language}_${mode}_${mode2}`] = true; try { await db.collection(`leaderboards.${language}.${mode}.${mode2}`).drop(); } catch (e) {} @@ -103,6 +107,7 @@ class LeaderboardsDAO { .createIndex({ rank: 1, }); + leaderboardUpdating[`${language}_${mode}_${mode2}`] = false; let end4 = performance.now(); let timeToRunAggregate = (end1 - start1) / 1000; diff --git a/backend/jobs/update-leaderboards.ts b/backend/jobs/update-leaderboards.ts index a35698dd9..15ce71607 100644 --- a/backend/jobs/update-leaderboards.ts +++ b/backend/jobs/update-leaderboards.ts @@ -8,7 +8,13 @@ const RECENT_AGE_MINUTES = 10; const RECENT_AGE_MILLISECONDS = RECENT_AGE_MINUTES * 60 * 1000; async function getTop10(leaderboardTime: string): Promise[]> { - return await LeaderboardsDAO.get("time", leaderboardTime, "english", 0, 10); + return (await LeaderboardsDAO.get( + "time", + leaderboardTime, + "english", + 0, + 10 + )) as any[]; } async function updateLeaderboardAndNotifyChanges(