@@ -3,41 +3,56 @@ const fetch = require('node-fetch')
33const Contest = require ( '../models/contest' )
44let halfHour = 1000 * 60 * 30
55
6+ async function pushRankingsToContest ( contest_id , rankings , pagesCnt , islastPage ) {
7+ try {
8+ await Contest . findOneAndUpdate ( {
9+ _id : contest_id
10+ } , {
11+ $push : {
12+ rankings : rankings ,
13+ } ,
14+ $inc : {
15+ pages_fetched : pagesCnt ,
16+ } ,
17+ $set : {
18+ rankings_fetched : islastPage ,
19+ } ,
20+ } ) ;
21+
22+ return null
23+ } catch ( err ) {
24+ console . log ( err )
25+ return err
26+ }
27+ }
628const fetchContestRankings = async function ( contestSlug ) {
729 try {
8- let contest = await Contest . findById ( contestSlug )
30+ let contest = await Contest . findById ( contestSlug , {
31+ rankings : 0
32+ } )
933 if ( ! contest ) {
10- console . error ( `Contest ${ contestSlug } not found in the db` )
11- return null
34+ return Error ( `Contest ${ contestSlug } not found in the db` )
1235 }
1336
1437 console . log ( `fetching ${ contestSlug } ...` )
15- rankings = [ ]
16- let resp = await fetch ( `https://leetcode.com/contest/api/ranking/${ contestSlug } /?pagination=1®ion=global` ) ;
38+ let resp = await fetch ( `https://leetcode.com/contest/api/ranking/${ contestSlug } /?region=global` ) ;
1739 resp = await resp . json ( )
18- let contest_id = resp . total_rank [ 0 ] . contest_id
19- let num_user = resp . user_num
20- let pages = Math . floor ( resp . user_num / 25 )
21- for ( let i = 1 ; i <= pages ; i ++ ) {
40+ // let num_user = resp.user_num
41+ let pages = Math . floor ( resp . user_num / 25 ) ,
42+ page = contest . pages_fetched + 1
43+ for ( let i = page ; i <= pages ; i ++ ) {
2244 console . log ( `Fetching rankings (${ contestSlug } ): page: ${ i } ` )
2345 let res = await fetch ( `https://leetcode.com/contest/api/ranking/${ contestSlug } /?pagination=${ i } ®ion=global` ) ;
2446 res = await res . json ( )
25- for ( ranks of res . total_rank ) {
47+ rankings = res . total_rank . filter ( ranks => ! ( ranks . score == 0 && ranks . finish_time * 1000 == contest . startTime . getTime ( ) ) ) . map ( ( ranks ) => {
2648 let {
2749 username,
2850 user_slug,
2951 country_code,
3052 country_name,
3153 data_region,
3254 rank,
33- score,
34- finish_time,
3555 } = ranks
36-
37- // no submission
38- if ( score === 0 && finish_time * 1000 == contest . startTime . getTime ( ) ) {
39- break // can also break page loop
40- }
4156 let ranking = {
4257 username,
4358 user_slug,
@@ -47,31 +62,21 @@ const fetchContestRankings = async function (contestSlug) {
4762 rank
4863 }
4964 ranking [ "_id" ] = username
50- rankings . push ( ranking )
65+ return ranking
66+ } )
67+ let err = await pushRankingsToContest ( contest . _id , rankings , 1 , i === pages )
68+ if ( err ) {
69+ return err
5170 }
5271 }
53-
54- let updatedContest = new Contest ( {
55- contest_id : contest_id ,
56- lastUpdated : Date . now ( ) ,
57- rankings : rankings ,
58- num_user : num_user ,
59- ratings_fetched : true
60- } )
61-
62- contest = await Contest . findByIdAndUpdate ( contestSlug , updatedContest , {
63- new : true
64- } )
65- console . log ( `Updated Rankings in ${ contestSlug } ` )
66-
67- return contest
68- } catch ( err ) {
69- console . error ( err ) ;
72+ console . log ( `Updated Rankings in ${ contestSlug } .` )
7073 return null
74+ } catch ( err ) {
75+ return err
7176 }
7277}
73- const fetchContest = async ( ) => {
74-
78+ const fetchContestsMetaData = async ( ) => {
79+ console . log ( "fetching meta data for all contests..." )
7580 try {
7681 let res = await fetch ( "https://leetcode.com/graphql" , {
7782 "headers" : {
@@ -129,17 +134,20 @@ const fetchContest = async () => {
129134 return null
130135 }
131136}
132- const getContestRankings = async function ( contestSlug ) {
137+ const updateContestRankings = async function ( contestSlug ) {
133138 let contest = await Contest . findById ( contestSlug , {
134139 rankings : 0
135140 } )
136- if ( ! contest || ! contest . ratings_fetched ) {
137- contest = await fetchContestRankings ( contestSlug )
141+ if ( ! contest ) {
142+ return Error ( `contest ${ contestSlug } not found in the db.` )
143+ } else if ( ! contest . rankings_fetched ) {
144+ let err = await fetchContestRankings ( contestSlug )
145+ return err
138146 }
139- return contest
147+ return null
140148}
141149
142150// exports
143- module . exports . fetchContest = fetchContest
144- exports . getContestRankings = getContestRankings
151+ exports . fetchContestsMetaData = fetchContestsMetaData
152+ exports . updateContestRankings = updateContestRankings
145153exports . fetchContestRankings = fetchContestRankings
0 commit comments