Skip to content

Commit 26bd257

Browse files
committedDec 15, 2021
feat: filter by country, improved pagination and minor fixes
1 parent 467a33f commit 26bd257

File tree

6 files changed

+323
-124
lines changed

6 files changed

+323
-124
lines changed
 

‎controllers/rankingsController.js

+65-13
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
const { isNumeric } = require("../helpers");
1+
const { isNumeric,generatePagination } = require("../helpers");
22
const Contest = require("../models/contest");
33

44
exports.get = async function (req, res) {
55
try {
66
let entries = 25;
77
let { contestSlug, page } = req.params;
8-
if (page == null) {
8+
const country = req.query.country || "ALL";
9+
const firstPage = req.query.firstPage;
10+
11+
if (firstPage || page == null) {
912
page = "1";
1013
}
1114
if (!isNumeric(page)) {
@@ -18,32 +21,81 @@ exports.get = async function (req, res) {
1821
return;
1922
}
2023
let toSkip = (page - 1) * entries;
21-
let contest = await Contest.findOne(
22-
{ _id: contestSlug },
23-
{
24-
rankings: { $slice: [toSkip, entries] },
25-
title: 1,
26-
user_num: 1,
27-
rankings_fetched: 1,
28-
}
29-
);
30-
24+
let contest;
25+
if(country!=="ALL"){
26+
contest = await Contest.aggregate(
27+
[
28+
{
29+
$project: {
30+
rankings_fetched:1,
31+
user_num:1,
32+
_id: 1,
33+
title: 1,
34+
rankings:1,
35+
},
36+
},
37+
{ $match: { _id: contestSlug } },
38+
{$addFields:{
39+
"rankings":{
40+
$filter:{
41+
input:"$rankings",
42+
as:"ranking",
43+
cond:{$eq:["$$ranking.country_code",country]}
44+
}
45+
},
46+
47+
}},
48+
{$addFields:{
49+
"user_num": {$size:"$rankings"},
50+
}},
51+
{$addFields:{
52+
"rankings":{
53+
$slice:["$rankings",toSkip,entries],
54+
}
55+
}}
56+
]);
57+
if(contest && contest.length!==0){
58+
contest = contest[0]
59+
}
60+
else{
61+
contest = NULL;
62+
}
63+
}
64+
else{
65+
contest = await Contest.findOne(
66+
{ _id: contestSlug },
67+
{
68+
rankings: { $slice: [toSkip, entries] },
69+
title: 1,
70+
user_num: 1,
71+
rankings_fetched: 1,
72+
}
73+
);
74+
}
75+
3176
if (!contest || !contest.rankings_fetched) {
3277
res.sendStatus(404);
3378
return;
3479
}
3580
const totalPages = Math.ceil(contest.user_num / 25);
36-
if (page > totalPages) {
81+
if (totalPages>0 && page > totalPages) {
3782
res.sendStatus(404);
3883
return;
3984
}
85+
const pages = generatePagination(totalPages,page);
86+
const params = new URLSearchParams({
87+
country,
88+
});
4089
res.render("ranking", {
4190
contest,
4291
totalPages,
4392
page,
93+
pages,
4494
searchResult: false,
4595
title: `${contest.title} | Leetcode Rating Predictor`,
96+
params:params.toString()
4697
});
98+
4799
} catch (err) {
48100
console.error(err);
49101
res.sendStatus(500);

‎helpers.js

+26
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,29 @@ exports.getRemainingTime = (time) => {
3030
exports.isNumeric = (value) => {
3131
return /^\d+$/.test(value);
3232
};
33+
34+
exports.generatePagination = (total,current)=>{
35+
let result = []
36+
let rem = 5;
37+
let start = Math.max(current-(2+Math.max(0,2-(total-current))),1);
38+
if(start>1){
39+
result.push(1);
40+
}
41+
if(start>2){
42+
result.push(-1);
43+
}
44+
for(let i=start;i<=current;i++){
45+
result.push(i);
46+
}
47+
rem -= current-start+1;
48+
for(let i=current+1;i<=current+rem && i<=total;i++){
49+
result.push(i);
50+
}
51+
if(current+rem<total-1){
52+
result.push(-1);
53+
}
54+
if(current+rem<total){
55+
result.push(total);
56+
}
57+
return result;
58+
};

‎services/job-queues/jobScheduler.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ scheduler.process("updateUserDataScheduler", async (job, done) => {
5353

5454
for (let i = 0; i < totalUsers; i += limit) {
5555
const date = new Date();
56-
const hoursWindow = date.getHours() / 4;
56+
const hoursWindow = Math.floor(date.getHours() / 4);
5757
const jobId = `updateUsers|${i}-${
5858
i + limit
5959
}|${hoursWindow}|${convertDateYYYYMMDD(date)}`;

‎services/users.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ const updateUsers = async (job) => {
448448
for (let i = 0; i < total; i += rateLimit) {
449449
let promises = [];
450450
for (let j = 0; j < rateLimit && i + j < total; j++) {
451-
if (
451+
if (users[i+j] &&
452452
Date.now() - users[i + j].lastUpdated <
453453
12 * 60 * 60 * 1000
454454
) {

‎views/layouts/layout.ejs

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<link rel="manifest" href="/site.webmanifest">
2121
<!-- Global site tag (gtag.js) - Google Analytics -->
2222
<script async src="https://www.googletagmanager.com/gtag/js?id=G-RYPSMF1X05"></script>
23+
<script data-ad-client="ca-pub-7334877242717971" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
2324
<script>
2425
window.dataLayer = window.dataLayer || [];
2526
function gtag(){dataLayer.push(arguments);}

0 commit comments

Comments
 (0)