diff --git a/config/custom-environment-variables.json b/config/custom-environment-variables.json index 4260d83e..36d2aaaf 100644 --- a/config/custom-environment-variables.json +++ b/config/custom-environment-variables.json @@ -49,5 +49,6 @@ "connectUrl": "CONNECT_URL", "accountsAppUrl": "ACCOUNTS_APP_URL", "inviteEmailSubject": "INVITE_EMAIL_SUBJECT", - "inviteEmailSectionTitle": "INVITE_EMAIL_SECTION_TITLE" + "inviteEmailSectionTitle": "INVITE_EMAIL_SECTION_TITLE", + "SSO_REFCODES": "SSO_REFCODES" } diff --git a/config/default.json b/config/default.json index 426be0be..367d8ca8 100644 --- a/config/default.json +++ b/config/default.json @@ -58,5 +58,6 @@ "connectUrl":"https://connect.topcoder-dev.com", "accountsAppUrl": "https://accounts.topcoder-dev.com", "MAX_REVISION_NUMBER": 100, - "UNIQUE_GMAIL_VALIDATION": false + "UNIQUE_GMAIL_VALIDATION": false, + "SSO_REFCODES": "[]" } diff --git a/src/events/busApi.js b/src/events/busApi.js index b1b69dc2..6895cccb 100644 --- a/src/events/busApi.js +++ b/src/events/busApi.js @@ -5,7 +5,7 @@ import { EVENT, BUS_API_EVENT, PROJECT_STATUS, PROJECT_PHASE_STATUS, PROJECT_MEM from '../constants'; import { createEvent } from '../services/busApi'; import models from '../models'; -import getTopcoderProjectMembers from '../util'; +import util from '../util'; /** * Map of project status and event name sent to bus api @@ -367,7 +367,7 @@ module.exports = (app, logger) => { userId: req.authUser.userId, initiatorUserId: req.authUser.userId, allowedUsers: created.status === PROJECT_PHASE_STATUS.DRAFT ? - getTopcoderProjectMembers(project.members) : null, + util.getTopcoderProjectMembers(project.members) : null, }, logger); return sendPlanReadyEventIfNeeded(req, project, created); }).catch(err => null); // eslint-disable-line no-unused-vars @@ -393,7 +393,7 @@ module.exports = (app, logger) => { userId: req.authUser.userId, initiatorUserId: req.authUser.userId, allowedUsers: deleted.status === PROJECT_PHASE_STATUS.DRAFT ? - getTopcoderProjectMembers(project.members) : null, + util.getTopcoderProjectMembers(project.members) : null, }, logger); }).catch(err => null); // eslint-disable-line no-unused-vars }); @@ -446,7 +446,7 @@ module.exports = (app, logger) => { userId: req.authUser.userId, initiatorUserId: req.authUser.userId, allowedUsers: updated.status === PROJECT_PHASE_STATUS.DRAFT ? - getTopcoderProjectMembers(project.members) : null, + util.getTopcoderProjectMembers(project.members) : null, }, logger)); events.forEach((event) => { eventsMap[event] = true; }); } @@ -493,7 +493,7 @@ module.exports = (app, logger) => { userId: req.authUser.userId, initiatorUserId: req.authUser.userId, allowedUsers: updated.status === PROJECT_PHASE_STATUS.DRAFT ? - getTopcoderProjectMembers(project.members) : null, + util.getTopcoderProjectMembers(project.members) : null, }, logger); } }).catch(err => null); // eslint-disable-line no-unused-vars @@ -700,63 +700,87 @@ module.exports = (app, logger) => { app.on(EVENT.ROUTING_KEY.PROJECT_MEMBER_INVITE_CREATED, ({ req, userId, email, status, role }) => { logger.debug('receive PROJECT_MEMBER_INVITE_CREATED event'); const projectId = _.parseInt(req.params.projectId); - - if (status === INVITE_STATUS.REQUESTED) { - createEvent(BUS_API_EVENT.PROJECT_MEMBER_INVITE_REQUESTED, { - projectId, - userId, - email, - role, - initiatorUserId: req.authUser.userId, - }, logger); - } else { - // send event to bus api - createEvent(BUS_API_EVENT.PROJECT_MEMBER_INVITE_CREATED, { - projectId, - userId, - email, - role, - initiatorUserId: req.authUser.userId, - }, logger); - } + models.Project.findOne({ + where: { id: projectId }, + }) + .then((project) => { + logger.debug(util.isSSO); + if (status === INVITE_STATUS.REQUESTED) { + createEvent(BUS_API_EVENT.PROJECT_MEMBER_INVITE_REQUESTED, { + projectId, + userId, + email, + role, + initiatorUserId: req.authUser.userId, + isSSO: util.isSSO(project), + }, logger); + } else { + // send event to bus api + logger.debug(JSON.stringify({ + projectId, + userId, + email, + role, + initiatorUserId: req.authUser.userId, + isSSO: util.isSSO(project), + })); + createEvent(BUS_API_EVENT.PROJECT_MEMBER_INVITE_CREATED, { + projectId, + userId, + email, + role, + initiatorUserId: req.authUser.userId, + isSSO: util.isSSO(project), + }, logger); + } + }).catch(err => logger.error(err)); // eslint-disable-line no-unused-vars }); app.on(EVENT.ROUTING_KEY.PROJECT_MEMBER_INVITE_UPDATED, ({ req, userId, email, status, role, createdBy }) => { logger.debug('receive PROJECT_MEMBER_INVITE_UPDATED event'); const projectId = _.parseInt(req.params.projectId); - if (status === INVITE_STATUS.REQUEST_APPROVED) { - // send event to bus api - createEvent(BUS_API_EVENT.PROJECT_MEMBER_INVITE_APPROVED, { - projectId, - userId, - originator: createdBy, - email, - role, - status, - initiatorUserId: req.authUser.userId, - }, logger); - } else if (status === INVITE_STATUS.REQUEST_REJECTED) { - // send event to bus api - createEvent(BUS_API_EVENT.PROJECT_MEMBER_INVITE_REJECTED, { - projectId, - userId, - originator: createdBy, - email, - role, - status, - initiatorUserId: req.authUser.userId, - }, logger); - } else { - // send event to bus api - createEvent(BUS_API_EVENT.PROJECT_MEMBER_INVITE_UPDATED, { - projectId, - userId, - email, - role, - status, - initiatorUserId: req.authUser.userId, - }, logger); - } + models.Project.findOne({ + where: { id: projectId }, + }) + .then((project) => { + logger.debug(util.isSSO); + if (status === INVITE_STATUS.REQUEST_APPROVED) { + // send event to bus api + createEvent(BUS_API_EVENT.PROJECT_MEMBER_INVITE_APPROVED, { + projectId, + userId, + originator: createdBy, + email, + role, + status, + initiatorUserId: req.authUser.userId, + isSSO: util.isSSO(project), + }, logger); + } else if (status === INVITE_STATUS.REQUEST_REJECTED) { + // send event to bus api + createEvent(BUS_API_EVENT.PROJECT_MEMBER_INVITE_REJECTED, { + projectId, + userId, + originator: createdBy, + email, + role, + status, + initiatorUserId: req.authUser.userId, + isSSO: util.isSSO(project), + }, logger); + } else { + // send event to bus api + createEvent(BUS_API_EVENT.PROJECT_MEMBER_INVITE_UPDATED, { + projectId, + userId, + email, + role, + status, + initiatorUserId: req.authUser.userId, + isSSO: util.isSSO(project), + }, logger); + } + }).catch(err => null); // eslint-disable-line no-unused-vars }); }; diff --git a/src/routes/projectMemberInvites/create.spec.js b/src/routes/projectMemberInvites/create.spec.js index 4aae6cd5..90ff16a7 100644 --- a/src/routes/projectMemberInvites/create.spec.js +++ b/src/routes/projectMemberInvites/create.spec.js @@ -841,6 +841,7 @@ describe('Project Member Invite create', () => { projectId: project1.id, userId: 3, email: null, + isSSO: false, })).should.be.true; done(); }); @@ -888,6 +889,7 @@ describe('Project Member Invite create', () => { projectId: project1.id, userId: null, email: 'hello@world.com', + isSSO: false, })).should.be.true; done(); }); diff --git a/src/routes/projectMemberInvites/update.spec.js b/src/routes/projectMemberInvites/update.spec.js index 0383291b..6256e5fd 100644 --- a/src/routes/projectMemberInvites/update.spec.js +++ b/src/routes/projectMemberInvites/update.spec.js @@ -359,6 +359,7 @@ describe('Project member invite update', () => { userId: invite1.userId, status: INVITE_STATUS.ACCEPTED, email: null, + isSSO: false, })).should.be.true; createEventSpy.secondCall.calledWith(BUS_API_EVENT.MEMBER_JOINED, sinon.match({ projectId: project1.id, diff --git a/src/util.js b/src/util.js index 7aa7b731..46cd75b2 100644 --- a/src/util.js +++ b/src/util.js @@ -28,6 +28,8 @@ const m2m = tcCoreLibAuth.m2m(config); const util = _.cloneDeep(require('tc-core-library-js').util(config)); +const ssoRefCodes = JSON.parse(config.get('SSO_REFCODES')); + // the client modifies the config object, so always passed the cloned object let esClient = null; @@ -468,6 +470,13 @@ _.assignIn(util, { */ getTopcoderProjectMembers: members => _(members).filter(m => m.role !== PROJECT_MEMBER_ROLE.CUSTOMER), + /** + * Check if project is for SSO users + * @param {Object} project project + * @return {Boolean} is SSO project + */ + isSSO: project => ssoRefCodes.indexOf(_.get(project, 'details.utm.code')) > -1, + /** * Check if the following model exist * @param {Object} keyInfo key information, it includes version and key