Skip to content

Commit d8b7fbc

Browse files
committed
Added Contest Ranklist table with pagination
1 parent e3026b6 commit d8b7fbc

File tree

4 files changed

+117
-12
lines changed

4 files changed

+117
-12
lines changed

models/contest.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const ContestRankingsSchema = new Schema({
66
startTime: Date,
77
endTime: Date,
88
contest_id: Number,
9+
num_user: Number,
910
lastUpdated:{
1011
type: Date,
1112
},

routes/index.js

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,45 @@
11
const express = require('express')
22
const contest = require('../models/contest')
3-
const { fetchContest } = require('../services/contests')
3+
const { fetchContest, fetchContestRankings } = require('../services/contests')
44
const router = express.Router()
55

66
router.get('/',(req,res)=> {
77
res.render("index")
88
})
99
//fetchContest()
10+
//fetchContestRankings('weekly-contest-242')
11+
12+
router.get('/contests',async (req,res) => {
13+
try {
14+
let contests = await contest.find({})
15+
res.render('contests/index',{contests:contests})
16+
}
17+
catch(error) {
18+
console.log("SHITTT")
19+
res.send(error.message)
20+
}
21+
})
22+
23+
router.get('/contests/:contestSlug/ranking/:page', async (req,res) => {
24+
try {
25+
let pageCount = 50
26+
let {contestSlug, page} = req.params
27+
let toSkip = (page - 1)*pageCount
28+
let contests = await contest.find({_id:contestSlug}, { 'rankings': { $slice: [toSkip,pageCount] }})
29+
let totalPages = 100
30+
if(contests[0].num_user){
31+
totalPages = contests[0].num_user/50
32+
}
33+
34+
console.log(contests)
35+
//res.send(contests[0]['rankings'])
36+
res.render('contests/ranking', {contests,totalPages,page})
37+
}
38+
catch(error){
39+
console.log(error.message)
40+
res.send(error.message)
41+
}
42+
})
1043

11-
router.get('/contests',async (req,res) => {
12-
try {
13-
let contests = await contest.find({})
14-
res.render('contests/index',{contests:contests})
15-
}
16-
catch(error) {
17-
console.log("SHITTT")
18-
res.send(error.message)
19-
}
20-
})
2144

2245
module.exports = router

services/contests.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const fetchContestRankings = async function(contestSlug) {
1414
let response = await fetch(`https://leetcode.com/contest/api/ranking/${contestSlug}/?pagination=1&region=global`);
1515
response = await response.json()
1616
let contest_id = response.total_rank[0].contest_id
17+
let num_User = response.user_num
1718
// TODO: remove hard coded lines
1819
let pages = 10//Math.floor(response.user_num/25)
1920
for(let i=1;i<=pages;i++){
@@ -31,7 +32,8 @@ const fetchContestRankings = async function(contestSlug) {
3132
_id: contestSlug,
3233
contest_id: contest_id,
3334
lastUpdated: Date.now(),
34-
rankings: rankings
35+
rankings: rankings,
36+
num_user: num_User
3537
})
3638
if(contest===null ){
3739
await newContest.save()
@@ -46,6 +48,7 @@ const fetchContestRankings = async function(contestSlug) {
4648
rankings: rankings,
4749
startTime: contest.startTime,
4850
endTime: contest.endTime,
51+
num_user: num_User
4952
})
5053
await Contest.findByIdAndUpdate(contestSlug, updatedContest)
5154
console.log(`Updated Rankings in contest ${contestSlug}`)

views/contests/ranking.ejs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
2+
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
3+
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
4+
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-143874982-1"></script>
5+
<script async defer src="https://buttons.github.io/buttons.js"></script>
6+
<script data-ad-client="ca-pub-5213877146531950" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
7+
<div class="container">
8+
<h1 class="mb-5 mt-3" style="text-align: center;">Ranking For <%= contests[0]._id %> </h1>
9+
<nav aria-label="...">
10+
<ul class="pagination">
11+
<% if (page>1) { %>
12+
13+
<li class="page-item"><a class="page-link" href="/contests/<%= contests[0]._id %>/ranking/1">1</a></li>
14+
<li class="page-item">
15+
<a class="page-link" href="/contests/<%= contests[0]._id %>/ranking/<%= page - 1 %>" tabindex="-1">Previous</a>
16+
</li>
17+
<% } %>
18+
19+
<li class="page-item active">
20+
<a class="page-link" href="/contests/<%= contests[0]._id %>/ranking/<%= page%>"><%= page %> <span class="sr-only">(current)</span></a>
21+
</li>
22+
<% if (page<totalPages) { %>
23+
<li class="page-item">
24+
<a class="page-link" href="/contests/<%= contests[0]._id %>/ranking/<%= parseInt(page) + 1 %>" tabindex="-1">Next</a>
25+
</li>
26+
<li class="page-item"><a class="page-link" href="/contests/<%= contests[0]._id %>/ranking/<%= totalPages %> "><%= totalPages %> </a></li>
27+
<% } %>
28+
29+
</ul>
30+
</nav>
31+
<div class="table-responsive">
32+
<table class="table table-hover table-striped table-fixed">
33+
<thead>
34+
<tr>
35+
<th>#</th>
36+
<th>Rank</th>
37+
<th>Name</th>
38+
<th>Country Name</th>
39+
</tr>
40+
</thead>
41+
<tbody>
42+
<% if (contests[0].rankings) { %>
43+
<% for( let i = 0; i < contests[0].rankings.length; i++ ) { %>
44+
<tr>
45+
<td><%= i+1 %> </td>
46+
<td><%= contests[0].rankings[i].rank %> </td>
47+
<td><a href="https://leetcode.com/<%=contests[0].rankings[i]._id%>/"><%= contests[0].rankings[i]._id %> </a></td>
48+
<td><%= contests[0].rankings[i].country_name %> </td>
49+
</tr>
50+
<% } %>
51+
<% } %>
52+
53+
</tbody>
54+
</table>
55+
<nav aria-label="...">
56+
<ul class="pagination">
57+
<% if (page>1) { %>
58+
59+
<li class="page-item"><a class="page-link" href="/contests/<%= contests[0]._id %>/ranking/1">1</a></li>
60+
<li class="page-item">
61+
<a class="page-link" href="/contests/<%= contests[0]._id %>/ranking/<%= page - 1 %>" tabindex="-1">Previous</a>
62+
</li>
63+
<% } %>
64+
65+
<li class="page-item active">
66+
<a class="page-link" href="/contests/<%= contests[0]._id %>/ranking/<%= page%>"><%= page %> <span class="sr-only">(current)</span></a>
67+
</li>
68+
<% if (page<totalPages) { %>
69+
<li class="page-item">
70+
<a class="page-link" href="/contests/<%= contests[0]._id %>/ranking/<%= parseInt(page) + 1 %>" tabindex="-1">Next</a>
71+
</li>
72+
<li class="page-item"><a class="page-link" href="/contests/<%= contests[0]._id %>/ranking/<%= totalPages %> "><%= totalPages %> </a></li>
73+
<% } %>
74+
75+
</ul>
76+
</nav>
77+
</div>
78+
</div>

0 commit comments

Comments
 (0)