mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2025-09-12 17:48:51 +08:00
leaderboard queries results
This commit is contained in:
parent
26d698c366
commit
79da897ef4
4 changed files with 82 additions and 2 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue