Skip to content

Commit af2d5b8

Browse files
committed
Reorganized project controller and modified getFinalists to be an async function
Removed commented code Added new winner votes controller function getFinalistProjectsWithAllVotes to return finalist projects with the votes received Removed sorting from getVotesForEvent function in the winner votes controller Modified structure of winner votes routes file to be more readable Deleted unused files Modified projects/winners page to show results sorted from highest to lowest vote count and improved performance by making only one call to the backend Modified participant/finalist-voting page to be readable and reduced the amount of calls done to the backend
1 parent 9036c5b commit af2d5b8

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)