1- const { isNumeric } = require ( "../helpers" ) ;
1+ const { isNumeric, generatePagination } = require ( "../helpers" ) ;
22const Contest = require ( "../models/contest" ) ;
33
44exports . 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 ) ;
0 commit comments