@@ -3,41 +3,56 @@ const fetch = require('node-fetch')
3
3
const Contest = require ( '../models/contest' )
4
4
let halfHour = 1000 * 60 * 30
5
5
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
+ }
6
28
const fetchContestRankings = async function ( contestSlug ) {
7
29
try {
8
- let contest = await Contest . findById ( contestSlug )
30
+ let contest = await Contest . findById ( contestSlug , {
31
+ rankings : 0
32
+ } )
9
33
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` )
12
35
}
13
36
14
37
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` ) ;
17
39
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 ++ ) {
22
44
console . log ( `Fetching rankings (${ contestSlug } ): page: ${ i } ` )
23
45
let res = await fetch ( `https://leetcode.com/contest/api/ranking/${ contestSlug } /?pagination=${ i } ®ion=global` ) ;
24
46
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 ) => {
26
48
let {
27
49
username,
28
50
user_slug,
29
51
country_code,
30
52
country_name,
31
53
data_region,
32
54
rank,
33
- score,
34
- finish_time,
35
55
} = ranks
36
-
37
- // no submission
38
- if ( score === 0 && finish_time * 1000 == contest . startTime . getTime ( ) ) {
39
- break // can also break page loop
40
- }
41
56
let ranking = {
42
57
username,
43
58
user_slug,
@@ -47,31 +62,21 @@ const fetchContestRankings = async function (contestSlug) {
47
62
rank
48
63
}
49
64
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
51
70
}
52
71
}
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 } .` )
70
73
return null
74
+ } catch ( err ) {
75
+ return err
71
76
}
72
77
}
73
- const fetchContest = async ( ) => {
74
-
78
+ const fetchContestsMetaData = async ( ) => {
79
+ console . log ( "fetching meta data for all contests..." )
75
80
try {
76
81
let res = await fetch ( "https://leetcode.com/graphql" , {
77
82
"headers" : {
@@ -129,17 +134,20 @@ const fetchContest = async () => {
129
134
return null
130
135
}
131
136
}
132
- const getContestRankings = async function ( contestSlug ) {
137
+ const updateContestRankings = async function ( contestSlug ) {
133
138
let contest = await Contest . findById ( contestSlug , {
134
139
rankings : 0
135
140
} )
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
138
146
}
139
- return contest
147
+ return null
140
148
}
141
149
142
150
// exports
143
- module . exports . fetchContest = fetchContest
144
- exports . getContestRankings = getContestRankings
151
+ exports . fetchContestsMetaData = fetchContestsMetaData
152
+ exports . updateContestRankings = updateContestRankings
145
153
exports . fetchContestRankings = fetchContestRankings
0 commit comments