diff --git a/backend/api/controllers/result.js b/backend/api/controllers/result.js index 841ac86a7..f86527444 100644 --- a/backend/api/controllers/result.js +++ b/backend/api/controllers/result.js @@ -195,16 +195,23 @@ class ResultController { static async getLeaderboard(req, res, next) { try { const { type, mode, mode2 } = req.params; - const results = await ResultDAO.getLeaderboard( - type, - mode, - parseInt(mode2) - ); + const results = await ResultDAO.getLeaderboard(type, mode, mode2); return res.status(200).json(results); } catch (e) { next(e); } } + + static async checkLeaderboardQualification(req, res, next) { + try { + const { uid } = req.decodedToken; + const { result } = req.body; + const data = await ResultDAO.checkLeaderboardQualification(uid, result); + return res.status(200).json(data); + } catch (e) { + next(e); + } + } } module.exports = ResultController; diff --git a/backend/api/routes/result.js b/backend/api/routes/result.js index 336a633de..7ad23bdd9 100644 --- a/backend/api/routes/result.js +++ b/backend/api/routes/result.js @@ -14,8 +14,13 @@ router.post("/deleteAll", authenticateRequest, ResultController.deleteAll); router.get( "/getLeaderboard/:type/:mode/:mode2", - authenticateRequest, ResultController.getLeaderboard ); +router.post( + "/checkLeaderboardQualification", + authenticateRequest, + ResultController.checkLeaderboardQualification +); + module.exports = router; diff --git a/backend/dao/result.js b/backend/dao/result.js index 71bc68972..6fda9c756 100644 --- a/backend/dao/result.js +++ b/backend/dao/result.js @@ -63,15 +63,22 @@ class ResultDAO { static async getLeaderboard(type, mode, mode2) { let count; + let startDate = new Date(); + let start = 0; if (type == "global") count = 999; - else if (type == "daily") count = 100; + else if (type == "daily") { + count = 100; + startDate.setUTCHours(0, 0, 0, 0); // next midnight UTC + start = startDate.getTime(); + } const leaders = await mongoDB() .collection("results") .aggregate([ { $match: { mode: mode, - mode2: mode2, + mode2: parseInt(mode2), + timestamp: { $gt: start }, }, }, { $sort: { wpm: -1 } }, @@ -106,6 +113,7 @@ class ResultDAO { return b.wpm - a.wpm; }); let leaderboard = { + type: type, size: board.length, board: board, }; @@ -116,6 +124,52 @@ class ResultDAO { } return leaderboard; } + + static async checkLeaderboardQualification(uid, result) { + function processLb(user, lb, result) { + let board = lb.board; + let data = {}; + data.foundAt = board.indexOf( + board.find((entry) => entry.name === user.name) + ); + let maxSize = 100; + if (lb.type === "global") maxSize = 999; + if ( + result.wpm < board[board.length - 1].wpm && + board.length === maxSize + ) { + data.insertedAt = -1; + } else { + for (let i = board.length - 1; i > 0; i--) { + if (result.wpm < board[i].wpm) { + data.insertedAt = i + 1; + break; + } + } + if (data.insertedAt === undefined) data.insertedAt = 0; + } + return data; + } + + const user = await mongoDB().collection("users").findOne({ uid: uid }); + //might need to check if email is verified with firebase + if (user.emailVerified === false) return { needsToVerifyEmail: true }; + if (user.name === undefined) return { noName: true }; + if (user.banned) return { banned: true }; + const globalLb = await this.getLeaderboard( + "global", + result.mode, + result.mode2 + ); + const dailyLb = await this.getLeaderboard( + "daily", + result.mode, + result.mode2 + ); + const globalData = processLb(user, globalLb, result); + const dailyData = processLb(user, dailyLb, result); + return { global: globalData, daily: dailyData }; + } } module.exports = ResultDAO; diff --git a/src/js/test/test-leaderboards.js b/src/js/test/test-leaderboards.js index cdfe05a47..c1b1166fc 100644 --- a/src/js/test/test-leaderboards.js +++ b/src/js/test/test-leaderboards.js @@ -161,7 +161,7 @@ export async function check(completedEvent) { delete lbRes.keyDuration; delete lbRes.chartData; axiosInstance - .post("/attemptAddToLeaderboards", { + .post("/results/checkLeaderboardQualification", { result: lbRes, }) .then((data) => {