Skip to content

Commit a16b615

Browse files
authored
Merge pull request #795 from wickathou/fix/improving-finalist-voting-performance
Fix - Improved performance of finalist voting
2 parents 59ba5c4 + af2d5b8 commit a16b615

7 files changed

Lines changed: 203 additions & 384 deletions

File tree

backend/modules/project/controller.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,12 @@ controller.exportProjects = async projectIds => {
213213

214214
return exportData
215215
}
216-
controller.getFinalists = event => {
217-
return Project.find({ _id: { $in: event.finalists } })
216+
controller.getFinalists = async event => {
217+
const finalistProjects = await Project.find({
218+
_id: { $in: event.finalists },
219+
})
220+
return finalistProjects
218221
}
219-
module.exports = controller
220222

221223
controller.getDataForPartnerReviewing = async (event, user) => {
222224
const data = {}
@@ -261,3 +263,5 @@ controller.getDataForPartnerReviewing = async (event, user) => {
261263
}
262264
return data
263265
}
266+
267+
module.exports = controller

backend/modules/project/model.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const AchievementSchema = require('../../common/schemas/Achievement')
66
const GavelController = require('../reviewing/gavel/controller')
77
const WebhookService = require('../../common/services/webhook')
88
const CustomAnswer = require('@hackjunction/shared/schemas/CustomAnswer')
9-
const ProjectDefaultFields = require('@hackjunction/shared/constants/project-default-fields')
9+
// const ProjectDefaultFields = require('@hackjunction/shared/constants/project-default-fields')
1010
// const AnswersSchema = require('@hackjunction/shared/schemas/Answers')
1111

1212
const ProjectSchema = new mongoose.Schema({
@@ -70,11 +70,6 @@ const ProjectSchema = new mongoose.Schema({
7070
submissionFormAnswers: {
7171
type: [CustomAnswer.mongoose],
7272
},
73-
// TODO default fields
74-
// enabledFields: {
75-
// type: [String],
76-
// default: ProjectDefaultFields,
77-
// },
7873
})
7974

8075
ProjectSchema.set('timestamps', true)

backend/modules/winner-votes/controller.js

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,56 @@
11
const _ = require('lodash')
22
const WinnerVote = require('./model')
3+
const projectController = require('../project/controller')
4+
const tokenVotingController = require('../voting-token/controller')
35

46
const controller = {}
57

8+
controller.getFinalistProjectsWithAllVotes = async event => {
9+
const finalistProjects = await projectController.getFinalists(event)
10+
const finalistProjectsWithVotes = finalistProjects.map(project => {
11+
const projectObject = project.toObject()
12+
projectObject.votingData = {
13+
totalVotes: 0,
14+
userVotes: 0,
15+
tokenVotes: 0,
16+
}
17+
return projectObject
18+
})
19+
const userVotes = await controller.getVotesForEvent(event)
20+
const tokenVotes = await tokenVotingController.getVotesByProject(event._id)
21+
if (userVotes) {
22+
userVotes.map(v => {
23+
const projectWithVotes = _.find(
24+
finalistProjectsWithVotes,
25+
project => project._id.toString() === v.project,
26+
)
27+
if (projectWithVotes) {
28+
projectWithVotes.votingData.userVotes = v.votes
29+
}
30+
})
31+
}
32+
if (tokenVotes) {
33+
tokenVotes.map(v => {
34+
const projectWithVotes = _.find(
35+
finalistProjectsWithVotes,
36+
project => project._id.toString() === v.project,
37+
)
38+
if (projectWithVotes) {
39+
projectWithVotes.votingData.tokenVotes = v.votes
40+
}
41+
})
42+
}
43+
finalistProjectsWithVotes.forEach(project => {
44+
project.votingData.totalVotes =
45+
project.votingData.userVotes + project.votingData.tokenVotes
46+
})
47+
const sortedProjects = _.sortBy(
48+
finalistProjectsWithVotes,
49+
n => -1 * n.votingData.totalVotes,
50+
)
51+
return sortedProjects
52+
}
53+
654
controller.getVotesForEvent = async event => {
755
const votes = await WinnerVote.find({ event: event._id }).lean()
856
const grouped = _.groupBy(votes, 'project')
@@ -14,8 +62,7 @@ controller.getVotesForEvent = async event => {
1462
})
1563
return result
1664
}, [])
17-
const sorted = _.sortBy(results, n => -1 * n.votes)
18-
return sorted
65+
return results
1966
}
2067

2168
module.exports = controller

backend/modules/winner-votes/routes.js

Lines changed: 74 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -12,55 +12,97 @@ const {
1212
isEventOrganiser,
1313
} = require('../../common/middleware/events')
1414

15+
const votingController = require('./controller')
16+
17+
const getProjectsWithVotesForEvent = asyncHandler(async (req, res) => {
18+
const finalistProjectsWithAllVotes =
19+
await votingController.getFinalistProjectsWithAllVotes(req.event)
20+
return res.status(200).json(finalistProjectsWithAllVotes)
21+
})
22+
23+
const getVote = asyncHandler(async (req, res) => {
24+
const vote = await WinnerVote.findOne({
25+
event: req.event._id,
26+
user: req.user.sub,
27+
})
28+
29+
return res.status(200).json(vote)
30+
})
31+
32+
const submitVote = asyncHandler(async (req, res) => {
33+
const vote = await WinnerVote.findOne({
34+
event: req.event._id,
35+
user: req.user.sub,
36+
})
37+
if (vote) {
38+
vote.project = req.body.projectId
39+
const result = await vote.save()
40+
return res.status(200).json(result)
41+
}
42+
const newVote = new WinnerVote({
43+
event: req.event._id,
44+
user: req.user.sub,
45+
project: req.body.projectId,
46+
})
47+
const result = await newVote.save()
48+
return res.status(200).json(result)
49+
})
50+
1551
router
1652
.route('/:slug')
1753
.get(
1854
hasToken,
1955
hasRegisteredToEvent,
20-
asyncHandler(async (req, res) => {
21-
const vote = await WinnerVote.findOne({
22-
event: req.event._id,
23-
user: req.user.sub,
24-
})
56+
getVote,
57+
// asyncHandler(async (req, res) => {
58+
// const vote = await WinnerVote.findOne({
59+
// event: req.event._id,
60+
// user: req.user.sub,
61+
// })
2562

26-
return res.status(200).json(vote)
27-
}),
63+
// return res.status(200).json(vote)
64+
// }),
2865
)
2966
.post(
3067
hasToken,
3168
hasRegisteredToEvent,
32-
asyncHandler(async (req, res) => {
33-
const vote = await WinnerVote.findOne({
34-
event: req.event._id,
35-
user: req.user.sub,
36-
})
37-
if (vote) {
38-
vote.project = req.body.projectId
39-
const result = await vote.save()
40-
return res.status(200).json(result)
41-
}
42-
const newVote = new WinnerVote({
43-
event: req.event._id,
44-
user: req.user.sub,
45-
project: req.body.projectId,
46-
})
47-
const result = await newVote.save()
48-
return res.status(200).json(result)
49-
}),
69+
submitVote,
70+
// asyncHandler(async (req, res) => {
71+
// const vote = await WinnerVote.findOne({
72+
// event: req.event._id,
73+
// user: req.user.sub,
74+
// })
75+
// if (vote) {
76+
// vote.project = req.body.projectId
77+
// const result = await vote.save()
78+
// return res.status(200).json(result)
79+
// }
80+
// const newVote = new WinnerVote({
81+
// event: req.event._id,
82+
// user: req.user.sub,
83+
// project: req.body.projectId,
84+
// })
85+
// const result = await newVote.save()
86+
// return res.status(200).json(result)
87+
// }),
5088
)
5189

5290
router.route('/:slug/results').get(
5391
hasToken,
5492
isEventOrganiser,
55-
asyncHandler(async (req, res) => {
56-
const votes = await WinnerVote.find({
57-
event: req.event._id,
58-
})
93+
getProjectsWithVotesForEvent,
94+
// asyncHandler(async (req, res) => {
95+
// const votes = await WinnerVote.find({
96+
// event: req.event._id,
97+
// })
5998

60-
const grouped = _.groupBy(votes, 'project')
99+
// const grouped = _.groupBy(votes, 'project')
100+
// console.log('Grouped votes:', grouped)
101+
// getProjectsWithVotesForEvent(req, res)
61102

62-
return res.status(200).json(grouped)
63-
}),
103+
// return res.status(200).json(grouped)
104+
// }
64105
)
106+
// )
65107

66108
module.exports = router

0 commit comments

Comments
 (0)