leaderboard queries results

This commit is contained in:
lukew3 2021-08-09 21:31:19 -04:00
parent 26d698c366
commit 79da897ef4
4 changed files with 82 additions and 2 deletions

View file

@ -191,6 +191,20 @@ class ResultController {
next(e);
}
}
static async getLeaderboard(req, res, next) {
try {
const { type, mode, mode2 } = req.params;
const results = await ResultDAO.getLeaderboard(
type,
mode,
parseInt(mode2)
);
return res.status(200).json(results);
} catch (e) {
next(e);
}
}
}
module.exports = ResultController;

View file

@ -12,4 +12,10 @@ router.post("/updateTags", authenticateRequest, ResultController.updateTags);
router.post("/deleteAll", authenticateRequest, ResultController.deleteAll);
router.get(
"/getLeaderboard/:type/:mode/:mode2",
authenticateRequest,
ResultController.getLeaderboard
);
module.exports = router;

View file

@ -60,6 +60,62 @@ class ResultDAO {
if (!result) throw new MonkeyError(404, "Result not found");
return result;
}
static async getLeaderboard(type, mode, mode2) {
let count;
if (type == "global") count = 999;
else if (type == "daily") count = 100;
const leaders = await mongoDB()
.collection("results")
.aggregate([
{
$match: {
mode: mode,
mode2: mode2,
},
},
{ $sort: { wpm: -1 } },
{
$group: {
_id: "$name",
doc: { $first: "$$ROOT" },
},
},
{
$replaceRoot: {
newRoot: "$doc",
},
},
{ $limit: count },
])
.toArray();
let board = [];
leaders.forEach((entry) => {
board.push({
name: entry.name,
wpm: entry.wpm,
acc: entry.acc,
raw: entry.rawWpm,
consistency: entry.consistency,
mode: entry.mode,
mode2: entry.mode2,
timestamp: entry.timestamp,
});
});
board.sort((a, b) => {
return b.wpm - a.wpm;
});
let leaderboard = {
size: board.length,
board: board,
};
if (type == "daily") {
var d = new Date();
d.setUTCHours(24, 0, 0, 0); // next midnight UTC
leaderboard.resetTime = d;
}
return leaderboard;
}
}
module.exports = ResultDAO;

View file

@ -30,8 +30,12 @@ function update() {
Loader.show();
Promise.all([
axiosInstance.get(`/getLeaderboard/daily/${boardinfo[0]}/${boardinfo[1]}`),
axiosInstance.get(`/getLeaderboard/global/${boardinfo[0]}/${boardinfo[1]}`),
axiosInstance.get(
`/results/getLeaderboard/daily/${boardinfo[0]}/${boardinfo[1]}`
),
axiosInstance.get(
`/results/getLeaderboard/global/${boardinfo[0]}/${boardinfo[1]}`
),
])
.then((lbdata) => {
Loader.hide();