Skip to content

Commit 82d85a8

Browse files
committed
chore: resolve conflicts
2 parents 4efee8a + bd8f3aa commit 82d85a8

File tree

20 files changed

+613
-76
lines changed

20 files changed

+613
-76
lines changed

constants/multer.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
module.exports = {
2-
FILE_SIZE_1MB: 1000000, // in bytes, 1000000 bytes = 1MB
3-
PROFILE_FILE_SIZE: 1000000
2+
FILE_SIZE_1MB: 1_000_000, // in bytes, 1000000 bytes = 1MB
3+
PROFILE_FILE_SIZE: 2_000_000 // Limiting profile upload size to 2MB
44
}

constants/roles.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const ROLES = {
2+
SUPER_USER: 'superUser',
3+
APP_OWNER: 'appOwner'
4+
}
5+
6+
module.exports = ROLES

controllers/badge.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,25 @@ const getBadges = async (req, res) => {
2020
}
2121
}
2222

23+
const getUserBadges = async (req, res) => {
24+
try {
25+
const result = await badgeQuery.fetchUserBadges(req.params.username)
26+
let responseMsg = ''
27+
if (result.userExists) {
28+
responseMsg = result.userBadges.length !== 0
29+
? 'User badges returned successfully!'
30+
: 'This user does not have any badges'
31+
return res.json({ message: responseMsg, userBadges: result.userBadges })
32+
} else {
33+
return res.boom.notFound('The user does not exist')
34+
}
35+
} catch (error) {
36+
logger.error(`Error while fetching all user badges: ${error}`)
37+
return res.boom.serverUnavailable('Something went wrong please contact admin')
38+
}
39+
}
40+
2341
module.exports = {
24-
getBadges
42+
getBadges,
43+
getUserBadges
2544
}

controllers/challenge.js

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,43 +3,62 @@ const challengeQuery = require('../models/challenges')
33
const ERROR_MESSAGE = 'Something went wrong. Please try again or contact admin'
44

55
/**
6-
* Get the challenges or add the challenge
6+
* Get the challenges
77
* @param {Object} req - Express request object
88
* @param {Object} res - Express response object
99
*/
1010

11-
const sendChallengeResponse = async (req, res) => {
11+
const fetchChallenges = async (req, res) => {
1212
try {
13-
if (req.method === 'GET') {
14-
const allChallenges = await challengeQuery.fetchChallenges()
15-
if (allChallenges.length > 0) {
16-
return res.status(200).json({
17-
message: 'Challenges returned successfully!',
18-
challenges: allChallenges
19-
})
20-
} else {
21-
return res.boom.notFound('No challenges found')
22-
}
13+
const allChallenges = await challengeQuery.fetchChallenges()
14+
const promiseArray = await getParticipantsofChallenges(allChallenges)
15+
const challengesWithParticipants = await Promise.all(promiseArray)
16+
return res.json({
17+
message: challengesWithParticipants.length ? 'Challenges returned successfully!' : 'No Challenges found',
18+
challenges: challengesWithParticipants
19+
})
20+
} catch (err) {
21+
logger.error(`Error while retrieving challenges ${err}`)
22+
return res.boom.serverUnavailable(ERROR_MESSAGE)
23+
}
24+
}
25+
26+
/**
27+
* Add a challenge
28+
* @param {Object} req - Express request object
29+
* @param {Object} res - Express response object
30+
*/
31+
32+
const createChallenge = async (req, res) => {
33+
try {
34+
const challengeAdded = await challengeQuery.postChallenge(req.body)
35+
if (challengeAdded) {
36+
return res.json({
37+
message: 'Challenge added successfully'
38+
})
2339
} else {
24-
if (req.method === 'POST') {
25-
const challengeAdded = await challengeQuery.postChallenge(req.body)
26-
if (challengeAdded) {
27-
return res.status(200).json({
28-
message: 'Challenge added successfully',
29-
challenges: challengeAdded
30-
})
31-
}
32-
} else {
33-
return res.boom.notFound('Unable to add challenge')
34-
}
40+
return res.boom.badRequest('Unable to add challenge')
3541
}
36-
return ''
3742
} catch (err) {
38-
logger.error(`Error while retriving challenges ${err}`)
43+
logger.error(`Error while adding challenge ${err}`)
3944
return res.boom.serverUnavailable(ERROR_MESSAGE)
4045
}
4146
}
4247

48+
/**
49+
* @param {Array} allChallenges
50+
* @returns {Promise<participants|Array>}
51+
*/
52+
const getParticipantsofChallenges = async (allChallenges) => {
53+
return allChallenges.map(async (challenge) => {
54+
const participants = await challengeQuery.fetchParticipantsData(challenge.participants)
55+
return {
56+
...challenge,
57+
participants
58+
}
59+
})
60+
}
61+
4362
/**
4463
* Suscribe user to a challenge
4564
* @param {Object} req - Express request object
@@ -52,7 +71,8 @@ const subscribeToChallenge = async (req, res) => {
5271
const subscribeUser = await challengeQuery.subscribeUserToChallenge(userId, challengeId)
5372
if (subscribeUser) {
5473
return res.status(200).json({
55-
message: 'User has subscribed to challenge'
74+
challenge_id: challengeId,
75+
is_user_subscribed: 1
5676
})
5777
} else {
5878
return res.boom.notFound('User cannot be subscribed to challenge')
@@ -64,6 +84,7 @@ const subscribeToChallenge = async (req, res) => {
6484
}
6585

6686
module.exports = {
67-
sendChallengeResponse,
87+
fetchChallenges,
88+
createChallenge,
6889
subscribeToChallenge
6990
}

controllers/members.js

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
const { ROLES } = require('../constants/users')
2-
const { fetchUsers, migrateUsers, deleteIsMemberProperty, fetchUsersWithRole } = require('../models/members')
2+
const { fetchUsers, migrateUsers, deleteIsMemberProperty, fetchUsersWithRole, moveToMembers: updateToMemberRole } = require('../models/members')
33
const tasks = require('../models/tasks')
4+
const { fetchUser } = require('../models/users')
5+
6+
const ERROR_MESSAGE = 'Something went wrong. Please try again or contact admin'
47

58
/**
69
* Fetches the data about our members
@@ -47,12 +50,38 @@ const getIdleMembers = async (req, res) => {
4750
}
4851
}
4952

53+
/**
54+
* Makes a new member a member
55+
*
56+
* @param req {Object} - Express request object
57+
* @param res {Object} - Express response object
58+
*/
59+
60+
const moveToMembers = async (req, res) => {
61+
try {
62+
const { username } = req.params
63+
const result = await fetchUser({ username })
64+
if (result.userExists) {
65+
const successObject = await updateToMemberRole(result.user.id)
66+
if (successObject.isAlreadyMember) {
67+
return res.boom.badRequest('User is already a member')
68+
}
69+
return res.status(204).send()
70+
}
71+
return res.boom.notFound("User doesn't exist")
72+
} catch (err) {
73+
logger.error(`Error while retriving contributions ${err}`)
74+
return res.boom.badImplementation(ERROR_MESSAGE)
75+
}
76+
}
77+
5078
/**
5179
* Returns the lists of usernames migrated
5280
*
5381
* @param req {Object} - Express request object
5482
* @param res {Object} - Express response object
5583
*/
84+
5685
const migrateUserRoles = async (req, res) => {
5786
try {
5887
const migratedUserData = await migrateUsers()
@@ -88,6 +117,7 @@ const deleteIsMember = async (req, res) => {
88117
module.exports = {
89118
getMembers,
90119
getIdleMembers,
120+
moveToMembers,
91121
migrateUserRoles,
92122
deleteIsMember
93123
}

docs/swaggerDefinition.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,17 @@ const swaggerOptions = {
482482
}
483483
}
484484
},
485+
userBadges: {
486+
type: 'object',
487+
properties: {
488+
title: {
489+
type: 'string'
490+
},
491+
description: {
492+
type: 'string'
493+
}
494+
}
495+
},
485496
userAvailable: {
486497
type: 'object',
487498
properties: {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const joi = require('joi')
2+
3+
const createChallenge = async (req, res, next) => {
4+
const schema = joi.object().strict().keys({
5+
title: joi.string().required(),
6+
level: joi.string().required(),
7+
start_date: joi.number().required(),
8+
end_date: joi.number().required()
9+
})
10+
11+
try {
12+
await schema.validateAsync(req.body)
13+
next()
14+
} catch (error) {
15+
logger.error(`Error validating createChallenge payload : ${error}`)
16+
res.boom.badRequest(error.details[0].message)
17+
}
18+
}
19+
20+
module.exports = {
21+
createChallenge
22+
}

models/badges.js

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const firestore = require('../utils/firestore')
22
const badgeModel = firestore.collection('badges')
3+
const { fetchUser } = require('../models/users')
34

45
/**
56
* Fetches the data about our badges
@@ -27,6 +28,38 @@ const fetchBadges = async ({
2728
}
2829
}
2930

31+
/**
32+
* Fetches the data about user badges
33+
* @param query { Object }: Filter for badges data
34+
* @return {Promise<userBadgeModel|Array>}
35+
*/
36+
37+
const fetchUserBadges = async (username) => {
38+
try {
39+
const userBadges = []
40+
let userExists = false
41+
const result = await fetchUser({ username })
42+
if (result.userExists) {
43+
userExists = true
44+
const userID = result.user.id
45+
const snapshot = await badgeModel.get()
46+
47+
snapshot.forEach((item) => {
48+
if (item.data()?.users?.includes(userID)) {
49+
const { title, description } = item.data()
50+
userBadges.push({ title, description })
51+
}
52+
})
53+
}
54+
55+
return { userExists, userBadges }
56+
} catch (err) {
57+
logger.error('Error retrieving user badges', err)
58+
return err
59+
}
60+
}
61+
3062
module.exports = {
31-
fetchBadges
63+
fetchBadges,
64+
fetchUserBadges
3265
}

models/challenges.js

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
const Firestore = require('@google-cloud/firestore')
77
const firestore = require('../utils/firestore')
8+
const { fetchUser } = require('./users')
89

910
const challengesModel = firestore.collection('challenges')
1011
const userModel = firestore.collection('users')
@@ -35,22 +36,47 @@ const fetchChallenges = async () => {
3536
}
3637
}
3738

39+
/**
40+
* Fetch the <user object> from participants array
41+
* @param {Array} participants
42+
* @returns {Promise<challengesModel|Array>}
43+
*/
44+
const fetchParticipantsData = async (participants) => {
45+
try {
46+
const promises = participants.map(async (userId) => {
47+
const { user } = await fetchUser({ userId })
48+
return {
49+
...user,
50+
phone: undefined,
51+
email: undefined
52+
}
53+
})
54+
const fetchedparticipants = await Promise.all(promises)
55+
return fetchedparticipants
56+
} catch (err) {
57+
logger.error('Failed to get participated users', err)
58+
throw err
59+
}
60+
}
61+
3862
/**
3963
* Post the challenge
4064
* @return {Promise<challengesModel|Array>}
4165
*/
4266

4367
const postChallenge = async (challengeData) => {
4468
try {
45-
const response = await challengesModel.add({
69+
const { start_date: startDate, end_date: endDate } = challengeData
70+
const startdate = new Firestore.Timestamp(startDate, 0)
71+
const enddate = new Firestore.Timestamp(endDate, 0)
72+
const challengeRef = await challengesModel.add({
4673
...challengeData,
74+
start_date: startdate,
75+
end_date: enddate,
4776
participants: [],
4877
is_active: true
4978
})
50-
const allChallenges = await fetchChallenges()
51-
if (response.id && allChallenges.length > 0) {
52-
return allChallenges
53-
} else return ''
79+
return challengeRef.id
5480
} catch (err) {
5581
logger.error(ERROR_MESSAGE, err)
5682
throw err
@@ -66,10 +92,10 @@ const postChallenge = async (challengeData) => {
6692
const subscribeUserToChallenge = async (userId, challengeId) => {
6793
try {
6894
const getUser = await userModel.doc(userId).get()
69-
const user = getUser.data().github_display_name
95+
const user = getUser.data()
7096
if (user) {
7197
const challengeRef = await challengesModel.doc(challengeId)
72-
await challengeRef.update({ participants: Firestore.FieldValue.arrayUnion({ name: user }) })
98+
await challengeRef.update({ participants: Firestore.FieldValue.arrayUnion(userId) })
7399
return challengeRef.get()
74100
} else {
75101
throw new Error(USER_DOES_NOT_EXIST_ERROR)
@@ -83,5 +109,6 @@ const subscribeUserToChallenge = async (userId, challengeId) => {
83109
module.exports = {
84110
fetchChallenges,
85111
postChallenge,
86-
subscribeUserToChallenge
112+
subscribeUserToChallenge,
113+
fetchParticipantsData
87114
}

0 commit comments

Comments
 (0)