Skip to content

Commit 5e42e97

Browse files
authored
Merge pull request #118 from topcoder-platform/plat-1226-bulk-apis
added functionalities to add and remove the members in bulk
2 parents 2767038 + 09f1da1 commit 5e42e97

File tree

4 files changed

+131
-13
lines changed

4 files changed

+131
-13
lines changed

.circleci/config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ workflows:
7171
branches:
7272
only:
7373
- develop
74+
- plat-1226-bulk-apis
7475
- "build-prod":
7576
context : org-global
7677
filters:

app-bootstrap.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
/**
22
* App bootstrap
33
*/
4-
global.Promise = require('bluebird')
4+
// commenting this as need to use the pure Promise features
5+
// global.Promise = require('bluebird')
56
const Joi = require('joi')
67

78
Joi.optionalId = () => Joi.string()

src/controllers/GroupMembershipController.js

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,21 @@ async function getGroupMembers (req, res) {
2525
* @param res the response
2626
*/
2727
async function addGroupMember (req, res) {
28-
const result = await service.addGroupMember(
29-
req.authUser.isMachine ? 'M2M' : req.authUser,
30-
req.params.groupId,
31-
req.body
32-
)
28+
let result
29+
if (req.body.members && req.body.members.length > 0) {
30+
result = await service.addGroupMemberBulk(
31+
req.authUser.isMachine ? 'M2M' : req.authUser,
32+
req.params.groupId,
33+
req.body
34+
)
35+
} else {
36+
result = await service.addGroupMember(
37+
req.authUser.isMachine ? 'M2M' : req.authUser,
38+
req.params.groupId,
39+
req.body
40+
)
41+
}
42+
3343
res.send(result)
3444
}
3545

@@ -53,12 +63,22 @@ async function getGroupMember (req, res) {
5363
* @param res the response
5464
*/
5565
async function deleteGroupMember (req, res) {
56-
const result = await service.deleteGroupMember(
57-
req.authUser.isMachine ? 'M2M' : req.authUser,
58-
req.params.groupId,
59-
req.params.memberId ? req.params.memberId : null,
60-
Object.keys(req.query).length !== 0 ? req.query : null
61-
)
66+
let result
67+
if (req.body && req.body.members && req.body.members.length > 0) {
68+
result = await service.deleteGroupMemberBulk(
69+
req.authUser.isMachine ? 'M2M' : req.authUser,
70+
req.params.groupId,
71+
req.body
72+
)
73+
} else {
74+
result = await service.deleteGroupMember(
75+
req.authUser.isMachine ? 'M2M' : req.authUser,
76+
req.params.groupId,
77+
req.params.memberId ? req.params.memberId : null,
78+
Object.keys(req.query).length !== 0 ? req.query : null
79+
)
80+
}
81+
6282
res.send(result)
6383
}
6484

src/services/GroupMembershipService.js

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,56 @@ addGroupMember.schema = Joi.alternatives().try(
172172
})
173173
)
174174

175+
/**
176+
* Add group members in bulk.
177+
* @param {Object} currentUser the current user
178+
* @param {String} groupId the id of group to add member
179+
* @param {Array} data the data for members to add
180+
* @returns {Object} the added group membership
181+
*/
182+
async function addGroupMemberBulk (currentUser, groupId, data) {
183+
logger.debug(`Enter in addGroupMemberBulk - Group = ${groupId} Data = ${JSON.stringify(data)}`)
184+
185+
const membersAddRes = await Promise.allSettled(data.members.map(member => addGroupMember(currentUser, groupId, member)))
186+
187+
const result = {}
188+
result.groupId = groupId
189+
190+
const members = data.members.map((member, i) => {
191+
if (membersAddRes[i].status === 'fulfilled') {
192+
return {
193+
memberId: member.memberId,
194+
status: 'success'
195+
}
196+
} else {
197+
return {
198+
memberId: member.memberId,
199+
status: 'failed',
200+
message: membersAddRes[i].reason.message
201+
}
202+
}
203+
})
204+
205+
result.members = members
206+
207+
return result
208+
}
209+
210+
addGroupMemberBulk.schema = Joi.object().keys({
211+
currentUser: Joi.any(),
212+
groupId: Joi.id(), // defined in app-bootstrap
213+
data: Joi.object()
214+
.keys({
215+
members: Joi.array().items(
216+
Joi.object({
217+
memberId: Joi.id(),
218+
membershipType: Joi.string().valid(_.values(config.MEMBERSHIP_TYPES)).required()
219+
})
220+
)
221+
.required()
222+
})
223+
})
224+
175225
/**
176226
* Delete group member.
177227
* @param {Object} currentUser the current user
@@ -257,6 +307,50 @@ deleteGroupMember.schema = {
257307
query: Joi.object().allow('', null)
258308
}
259309

310+
/**
311+
* Delete group members in bulk.
312+
* @param {Object} currentUser the current user
313+
* @param {String} groupId the id of group from members to delete
314+
* @param {Array} data the data for members to delete
315+
* @returns {Object} the deleted group membership
316+
*/
317+
async function deleteGroupMemberBulk (currentUser, groupId, data) {
318+
logger.debug(`Enter in deleteGroupMemberBulk - Group = ${groupId} Data = ${JSON.stringify(data)}`)
319+
320+
const membersAddRes = await Promise.allSettled(data.members.map(member => deleteGroupMember(currentUser, groupId, member)))
321+
322+
const result = {}
323+
result.groupId = groupId
324+
325+
const members = data.members.map((member, i) => {
326+
if (membersAddRes[i].status === 'fulfilled') {
327+
return {
328+
memberId: member,
329+
status: 'success'
330+
}
331+
} else {
332+
return {
333+
memberId: member,
334+
status: 'failed',
335+
message: membersAddRes[i].reason.message
336+
}
337+
}
338+
})
339+
340+
result.members = members
341+
342+
return result
343+
}
344+
345+
deleteGroupMemberBulk.schema = Joi.object().keys({
346+
currentUser: Joi.any(),
347+
groupId: Joi.id(), // defined in app-bootstrap
348+
data: Joi.object()
349+
.keys({
350+
members: Joi.array().required()
351+
})
352+
})
353+
260354
/**
261355
* Get group members
262356
* @param {Object} currentUser the current user
@@ -597,7 +691,9 @@ module.exports = {
597691
getGroupMembersCount,
598692
listGroupsMemberCount,
599693
getMemberGroups,
600-
groupValidityCheck
694+
groupValidityCheck,
695+
addGroupMemberBulk,
696+
deleteGroupMemberBulk
601697
}
602698

603699
logger.buildService(module.exports)

0 commit comments

Comments
 (0)