check leaderboard qualification and fix daily lb not limiting to today

This commit is contained in:
lukew3 2021-08-10 13:56:22 -04:00
parent 79da897ef4
commit dbeb90c077
4 changed files with 75 additions and 9 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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) => {