Skip to content

Commit c656ce4

Browse files
committed
update fetchContestRatings
1 parent d942f1c commit c656ce4

File tree

3 files changed

+101
-67
lines changed

3 files changed

+101
-67
lines changed

models/contest.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ const ContestRankingsSchema = new Schema({
2626
endTime: Date,
2727
contest_id: Number,
2828
num_user: Number,
29-
ratings_fetched: {
29+
pages_fetched: {
30+
type: Number,
31+
default:0,
32+
},
33+
rankings_fetched: {
3034
type: Boolean,
3135
default: false,
3236
},

services/contests.js

Lines changed: 51 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,41 +3,56 @@ const fetch = require('node-fetch')
33
const Contest = require('../models/contest')
44
let 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+
}
628
const 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&region=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}&region=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
145153
exports.fetchContestRankings = fetchContestRankings

services/scheduling.js

Lines changed: 45 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,60 @@
1-
const {getContestRankings , fetchContest} = require('../services/contests')
1+
const {
2+
updateContestRankings,
3+
fetchContestsMetaData
4+
} = require('../services/contests')
25
const schedule = require('node-schedule');
36

47
//Variables For testing
5-
const jobScheduleTime = {hour: 00,minute: 00}
6-
const contestScheduleCall = { start: Date.now(), end: Date.now() + 1000*60*60, rule: '*/5 * * * *' }
8+
const jobScheduleTime = {
9+
hour: 00,
10+
minute: 00
11+
}
12+
const contestScheduleCall = {
13+
start: Date.now(),
14+
end: Date.now() + 1000 * 60 * 60,
15+
rule: '*/5 * * * *'
16+
}
717

818

9-
const job = schedule.scheduleJob({hour: 00, minute: 00,},async function(){
10-
let contestList = await fetchContest()
11-
for(let i=0;i<contestList.length;i++){
12-
if(Date.now() + 1000*60*60*24 > contestList[i].startTime && Date.now()<contestList[i].startTime){
13-
const event = schedule.scheduleJob({ start: contestList[todaysContest].startTime, end: contestList[todaysContest].endTime, rule: '*/5 * * * *' },
14-
async function(){
15-
getContestRankings(contestList[i].titleSlug)
16-
});
19+
const job = schedule.scheduleJob({
20+
hour: 00,
21+
minute: 00,
22+
}, async function () {
23+
let contestList = await fetchContestsMetaData()
24+
for (let i = 0; i < contestList.length; i++) {
25+
if (Date.now() + 1000 * 60 * 60 * 24 > contestList[i].startTime && Date.now() < contestList[i].startTime) {
26+
const event = schedule.scheduleJob({
27+
start: contestList[todaysContest].startTime,
28+
end: contestList[todaysContest].endTime,
29+
rule: '*/5 * * * *'
30+
},
31+
async function () {
32+
getContestRankings(contestList[i].titleSlug)
33+
});
1734
}
18-
let endTime = contestList[i].startTime*1000 + contestList[i].duration*1000
19-
if(Date.now()>endTime){
35+
let endTime = contestList[i].startTime * 1000 + contestList[i].duration * 1000
36+
if (Date.now() > endTime) {
2037
await getContestRankings(contestList[i].titleSlug)
2138
}
2239
}
2340
});
2441

25-
const fetchNow = async function(){
26-
let contestList = await fetchContest()
27-
if(!contestList)
42+
const fetchAllContests = async function () {
43+
let contestList = await fetchContestsMetaData()
44+
if (!contestList)
2845
return
29-
let promises = contestList.map(async (contest)=>{
30-
// console.log(contest)
31-
let endTime = contest.startTime*1000 + contest.duration*1000
32-
if(Date.now()> endTime){
33-
// console.log(endTime)
34-
await getContestRankings(contest.titleSlug)
46+
let promises = contestList.map(async (contest) => {
47+
let endTime = contest.startTime * 1000 + contest.duration * 1000
48+
if (Date.now() > endTime) {
49+
try {
50+
var err = await updateContestRankings(contest.titleSlug)
51+
if (err) {
52+
console.error(err)
53+
}
54+
} catch (err) {
55+
console.error(err)
56+
}
3557
}
3658
})
3759
}
38-
exports.fetchAllContests = fetchNow
60+
exports.fetchAllContests = fetchAllContests

0 commit comments

Comments
 (0)