diff --git a/.circleci/config.yml b/.circleci/config.yml index c36a632..9089815 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -71,6 +71,7 @@ workflows: branches: only: - develop + - plat-1226-bulk-apis - "build-prod": context : org-global filters: diff --git a/app-bootstrap.js b/app-bootstrap.js index e689199..d24e381 100644 --- a/app-bootstrap.js +++ b/app-bootstrap.js @@ -1,7 +1,8 @@ /** * App bootstrap */ -global.Promise = require('bluebird') +// commenting this as need to use the pure Promise features +// global.Promise = require('bluebird') const Joi = require('joi') Joi.optionalId = () => Joi.string() diff --git a/src/controllers/GroupMembershipController.js b/src/controllers/GroupMembershipController.js index 38238dd..774b203 100644 --- a/src/controllers/GroupMembershipController.js +++ b/src/controllers/GroupMembershipController.js @@ -25,11 +25,21 @@ async function getGroupMembers (req, res) { * @param res the response */ async function addGroupMember (req, res) { - const result = await service.addGroupMember( - req.authUser.isMachine ? 'M2M' : req.authUser, - req.params.groupId, - req.body - ) + let result + if (req.body.members && req.body.members.length > 0) { + result = await service.addGroupMemberBulk( + req.authUser.isMachine ? 'M2M' : req.authUser, + req.params.groupId, + req.body + ) + } else { + result = await service.addGroupMember( + req.authUser.isMachine ? 'M2M' : req.authUser, + req.params.groupId, + req.body + ) + } + res.send(result) } @@ -53,12 +63,22 @@ async function getGroupMember (req, res) { * @param res the response */ async function deleteGroupMember (req, res) { - const result = await service.deleteGroupMember( - req.authUser.isMachine ? 'M2M' : req.authUser, - req.params.groupId, - req.params.memberId ? req.params.memberId : null, - Object.keys(req.query).length !== 0 ? req.query : null - ) + let result + if (req.body && req.body.members && req.body.members.length > 0) { + result = await service.deleteGroupMemberBulk( + req.authUser.isMachine ? 'M2M' : req.authUser, + req.params.groupId, + req.body + ) + } else { + result = await service.deleteGroupMember( + req.authUser.isMachine ? 'M2M' : req.authUser, + req.params.groupId, + req.params.memberId ? req.params.memberId : null, + Object.keys(req.query).length !== 0 ? req.query : null + ) + } + res.send(result) } diff --git a/src/services/GroupMembershipService.js b/src/services/GroupMembershipService.js index 2f9d817..bd99297 100644 --- a/src/services/GroupMembershipService.js +++ b/src/services/GroupMembershipService.js @@ -172,6 +172,56 @@ addGroupMember.schema = Joi.alternatives().try( }) ) +/** + * Add group members in bulk. + * @param {Object} currentUser the current user + * @param {String} groupId the id of group to add member + * @param {Array} data the data for members to add + * @returns {Object} the added group membership + */ +async function addGroupMemberBulk (currentUser, groupId, data) { + logger.debug(`Enter in addGroupMemberBulk - Group = ${groupId} Data = ${JSON.stringify(data)}`) + + const membersAddRes = await Promise.allSettled(data.members.map(member => addGroupMember(currentUser, groupId, member))) + + const result = {} + result.groupId = groupId + + const members = data.members.map((member, i) => { + if (membersAddRes[i].status === 'fulfilled') { + return { + memberId: member.memberId, + status: 'success' + } + } else { + return { + memberId: member.memberId, + status: 'failed', + message: membersAddRes[i].reason.message + } + } + }) + + result.members = members + + return result +} + +addGroupMemberBulk.schema = Joi.object().keys({ + currentUser: Joi.any(), + groupId: Joi.id(), // defined in app-bootstrap + data: Joi.object() + .keys({ + members: Joi.array().items( + Joi.object({ + memberId: Joi.id(), + membershipType: Joi.string().valid(_.values(config.MEMBERSHIP_TYPES)).required() + }) + ) + .required() + }) +}) + /** * Delete group member. * @param {Object} currentUser the current user @@ -257,6 +307,50 @@ deleteGroupMember.schema = { query: Joi.object().allow('', null) } +/** + * Delete group members in bulk. + * @param {Object} currentUser the current user + * @param {String} groupId the id of group from members to delete + * @param {Array} data the data for members to delete + * @returns {Object} the deleted group membership + */ +async function deleteGroupMemberBulk (currentUser, groupId, data) { + logger.debug(`Enter in deleteGroupMemberBulk - Group = ${groupId} Data = ${JSON.stringify(data)}`) + + const membersAddRes = await Promise.allSettled(data.members.map(member => deleteGroupMember(currentUser, groupId, member))) + + const result = {} + result.groupId = groupId + + const members = data.members.map((member, i) => { + if (membersAddRes[i].status === 'fulfilled') { + return { + memberId: member, + status: 'success' + } + } else { + return { + memberId: member, + status: 'failed', + message: membersAddRes[i].reason.message + } + } + }) + + result.members = members + + return result +} + +deleteGroupMemberBulk.schema = Joi.object().keys({ + currentUser: Joi.any(), + groupId: Joi.id(), // defined in app-bootstrap + data: Joi.object() + .keys({ + members: Joi.array().required() + }) +}) + /** * Get group members * @param {Object} currentUser the current user @@ -597,7 +691,9 @@ module.exports = { getGroupMembersCount, listGroupsMemberCount, getMemberGroups, - groupValidityCheck + groupValidityCheck, + addGroupMemberBulk, + deleteGroupMemberBulk } logger.buildService(module.exports)