11const fetch = require ( "node-fetch" ) ;
22const Contest = require ( "../models/contest" ) ;
3+ const { IsLatestContest } = require ( "../helpers" ) ;
34
4- // async function pushRankingsToContest(
5- // contest_id,
6- // rankings,
7- // pagesCnt,
8- // islastPage
9- // ) {
10- // try {
11- // await Contest.findOneAndUpdate(
12- // {
13- // _id: contest_id,
14- // },
15- // {
16- // $push: {
17- // rankings: rankings,
18- // },
19- // $inc: {
20- // pages_fetched: pagesCnt,
21- // },
22- // $set: {
23- // rankings_fetched: islastPage,
24- // },
25- // }
26- // );
27-
28- // return null;
29- // } catch (err) {
30- // console.log(err);
31- // return err;
32- // }
33- // }
345const fetchContestRankings = async function ( contestSlug ) {
356 try {
36- let contest = await Contest . findById ( contestSlug , { rankings : 0 } ) ;
7+ let contest = await Contest . findById ( contestSlug ) ;
378 if ( ! contest ) {
38- return Error ( `Contest ${ contestSlug } not found in the db` ) ;
9+ return [ null , Error ( `Contest ${ contestSlug } not found in the db` ) ] ;
10+ }
11+ if ( contest . rankings_fetched ) {
12+ return [ contest , null ] ;
3913 }
4014
4115 console . log ( `fetching ${ contestSlug } ...` ) ;
@@ -46,16 +20,23 @@ const fetchContestRankings = async function (contestSlug) {
4620 let pages = Math . floor ( resp . user_num / 25 ) ;
4721 let all_rankings = [ ] ;
4822 let failed = [ ] ;
23+ let lastPage = Math . MAX_SAFE_INTEGER ;
4924 const fetchPageRankings = async (
5025 pageNo ,
5126 retries ,
5227 throwError = false
5328 ) => {
29+ if ( pageNo > lastPage ) {
30+ return ;
31+ }
5432 console . log ( `Fetching rankings (${ contestSlug } ): page: ${ pageNo } ` ) ;
5533 try {
5634 let res = await fetch (
5735 `https://leetcode.com/contest/api/ranking/${ contestSlug } /?pagination=${ pageNo } ®ion=global`
5836 ) ;
37+ if ( res . status !== 200 ) {
38+ throw new Error ( res . statusText ) ;
39+ }
5940 res = await res . json ( ) ;
6041 rankings = res . total_rank
6142 . filter (
@@ -86,15 +67,18 @@ const fetchContestRankings = async function (contestSlug) {
8667 ranking [ "_id" ] = username ;
8768 return ranking ;
8869 } ) ;
70+ if ( rankings . length < 25 ) {
71+ lastPage = Math . min ( lastPage , pageNo ) ;
72+ }
8973 all_rankings = all_rankings . concat ( rankings ) ;
9074 console . log (
91- `Fetched rankings (${ contestSlug } ): page: ${ pageNo } `
75+ `Fetched rankings (${ contestSlug } page: ${ pageNo } ) `
9276 ) ;
9377 } catch ( err ) {
9478 console . log (
95- `Failed to fetch rankings (${ contestSlug } , page: ${ pageNo } )`
79+ `Failed to fetch rankings (${ contestSlug } page: ${ pageNo } )` ,
80+ err . message
9681 ) ;
97- console . log ( err ) ;
9882 if ( retries > 0 ) {
9983 await fetchPageRankings ( pageNo , retries - 1 ) ;
10084 } else if ( throwError ) {
@@ -121,11 +105,12 @@ const fetchContestRankings = async function (contestSlug) {
121105 all_rankings . sort ( ( a , b ) => ( a . rank > b . rank ? 1 : - 1 ) ) ;
122106 contest . rankings = all_rankings ;
123107 contest . rankings_fetched = true ;
124- contest . user_num = resp . user_num ;
125- await contest . save ( ) ;
108+ contest . user_num = all_rankings . length ;
109+ await contest . update ( ) ;
126110 console . log ( `Updated Rankings in ${ contestSlug } .` ) ;
111+ return [ contest , null ] ;
127112 } catch ( err ) {
128- return err ;
113+ return [ null , err ] ;
129114 }
130115} ;
131116const fetchContestsMetaData = async ( ) => {
@@ -163,14 +148,10 @@ const fetchContestsMetaData = async () => {
163148 } ) ;
164149 res = await res . json ( ) ;
165150
166- const withinAWeek = ( endTime ) => {
167- return Date . now ( ) - endTime <= 7 * 24 * 60 * 60 * 1000 ;
168- } ;
169-
170151 for ( let i = 0 ; i < res . data . allContests . length ; i ++ ) {
171152 let contest = res . data . allContests [ i ] ;
172153 const endTime = contest . startTime * 1000 + contest . duration * 1000 ;
173- if ( ! withinAWeek ( endTime ) ) {
154+ if ( ! IsLatestContest ( endTime ) ) {
174155 continue ;
175156 }
176157 let contestExists = await Contest . exists ( {
@@ -179,13 +160,12 @@ const fetchContestsMetaData = async () => {
179160 if ( contestExists ) {
180161 continue ;
181162 }
182- console . log ( contest . titleSlug ) ;
183163 let newContest = new Contest ( {
184164 _id : contest . titleSlug ,
165+ title : contest . title ,
185166 startTime : contest . startTime * 1000 ,
186167 endTime : endTime ,
187168 lastUpdated : Date . now ( ) ,
188- num_user : contest . num_user ,
189169 } ) ;
190170 await newContest . save ( ) ;
191171 console . log ( `created new contest: ${ contest . titleSlug } ` ) ;
@@ -197,25 +177,7 @@ const fetchContestsMetaData = async () => {
197177 return null ;
198178 }
199179} ;
200- const updateContestRankings = async function ( contestSlug ) {
201- try {
202- let contest = await Contest . findById ( contestSlug , {
203- rankings : 0 ,
204- } ) ;
205-
206- if ( ! contest ) {
207- return Error ( `contest ${ contestSlug } not found in the db.` ) ;
208- } else if ( ! contest . rankings_fetched ) {
209- let err = await fetchContestRankings ( contestSlug ) ;
210- return err ;
211- }
212- return null ;
213- } catch ( err ) {
214- return err ;
215- }
216- } ;
217180
218181// exports
219182exports . fetchContestsMetaData = fetchContestsMetaData ;
220- exports . updateContestRankings = updateContestRankings ;
221183exports . fetchContestRankings = fetchContestRankings ;
0 commit comments