From 49ca2db4fe37b6fba9f29a2b05451bba117c21fb Mon Sep 17 00:00:00 2001 From: Samir Date: Thu, 6 Jun 2019 01:52:47 +0200 Subject: [PATCH 1/4] set SSO flag for invite events --- config/custom-environment-variables.json | 3 +- config/default.json | 3 +- src/events/busApi.js | 120 +++++++++++++---------- src/util.js | 9 ++ 4 files changed, 80 insertions(+), 55 deletions(-) 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..77a21dad 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 { getTopcoderProjectMembers, isSSO } from '../util'; /** * Map of project status and event name sent to bus api @@ -700,63 +700,77 @@ 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) => { + if (status === INVITE_STATUS.REQUESTED) { + createEvent(BUS_API_EVENT.PROJECT_MEMBER_INVITE_REQUESTED, { + projectId, + userId, + email, + role, + initiatorUserId: req.authUser.userId, + isSSO: isSSO(project), + }, logger); + } else { + // send event to bus api + createEvent(BUS_API_EVENT.PROJECT_MEMBER_INVITE_CREATED, { + projectId, + userId, + email, + role, + initiatorUserId: req.authUser.userId, + isSSO: isSSO(project), + }, logger); + } + }).catch(err => null); // 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) => { + 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: 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: 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: isSSO(project), + }, logger); + } + }).catch(err => null); // eslint-disable-line no-unused-vars }); }; 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 From cf60218567f0e76ac247596391b7ead132eee980 Mon Sep 17 00:00:00 2001 From: Samir Date: Thu, 6 Jun 2019 02:20:36 +0200 Subject: [PATCH 2/4] update tests --- src/routes/projectMemberInvites/create.spec.js | 2 ++ src/routes/projectMemberInvites/update.spec.js | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/routes/projectMemberInvites/create.spec.js b/src/routes/projectMemberInvites/create.spec.js index 4aae6cd5..5ac07e5f 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..1e1f8f06 100644 --- a/src/routes/projectMemberInvites/update.spec.js +++ b/src/routes/projectMemberInvites/update.spec.js @@ -359,18 +359,21 @@ 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, projectName: project1.name, userId: invite1.userId, initiatorUserId: 40051331, + isSSO: false })).should.be.true; createEventSpy.thirdCall.calledWith(BUS_API_EVENT.PROJECT_TEAM_UPDATED, sinon.match({ projectId: project1.id, projectName: project1.name, userId: invite1.userId, initiatorUserId: 40051331, + isSSO: false })).should.be.true; done(); }); From a677de2302be1d1f2786f6d34294d3b91f698eb0 Mon Sep 17 00:00:00 2001 From: Samir Date: Thu, 6 Jun 2019 02:23:53 +0200 Subject: [PATCH 3/4] fix lint --- src/routes/projectMemberInvites/create.spec.js | 4 ++-- src/routes/projectMemberInvites/update.spec.js | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/routes/projectMemberInvites/create.spec.js b/src/routes/projectMemberInvites/create.spec.js index 5ac07e5f..90ff16a7 100644 --- a/src/routes/projectMemberInvites/create.spec.js +++ b/src/routes/projectMemberInvites/create.spec.js @@ -841,7 +841,7 @@ describe('Project Member Invite create', () => { projectId: project1.id, userId: 3, email: null, - isSSO: false + isSSO: false, })).should.be.true; done(); }); @@ -889,7 +889,7 @@ describe('Project Member Invite create', () => { projectId: project1.id, userId: null, email: 'hello@world.com', - isSSO: false + isSSO: false, })).should.be.true; done(); }); diff --git a/src/routes/projectMemberInvites/update.spec.js b/src/routes/projectMemberInvites/update.spec.js index 1e1f8f06..e5ca3565 100644 --- a/src/routes/projectMemberInvites/update.spec.js +++ b/src/routes/projectMemberInvites/update.spec.js @@ -359,21 +359,21 @@ describe('Project member invite update', () => { userId: invite1.userId, status: INVITE_STATUS.ACCEPTED, email: null, - isSSO: false + isSSO: false, })).should.be.true; createEventSpy.secondCall.calledWith(BUS_API_EVENT.MEMBER_JOINED, sinon.match({ projectId: project1.id, projectName: project1.name, userId: invite1.userId, initiatorUserId: 40051331, - isSSO: false + isSSO: false, })).should.be.true; createEventSpy.thirdCall.calledWith(BUS_API_EVENT.PROJECT_TEAM_UPDATED, sinon.match({ projectId: project1.id, projectName: project1.name, userId: invite1.userId, initiatorUserId: 40051331, - isSSO: false + isSSO: false, })).should.be.true; done(); }); From c0016d1015186f8ba132e466fa4acac3d3da766b Mon Sep 17 00:00:00 2001 From: Samir Date: Thu, 6 Jun 2019 03:40:35 +0200 Subject: [PATCH 4/4] fix tests --- src/events/busApi.js | 32 ++++++++++++------- .../projectMemberInvites/update.spec.js | 2 -- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/src/events/busApi.js b/src/events/busApi.js index 77a21dad..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, isSSO } 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 @@ -704,6 +704,7 @@ module.exports = (app, logger) => { where: { id: projectId }, }) .then((project) => { + logger.debug(util.isSSO); if (status === INVITE_STATUS.REQUESTED) { createEvent(BUS_API_EVENT.PROJECT_MEMBER_INVITE_REQUESTED, { projectId, @@ -711,20 +712,28 @@ module.exports = (app, logger) => { email, role, initiatorUserId: req.authUser.userId, - isSSO: isSSO(project), + 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: isSSO(project), + isSSO: util.isSSO(project), }, logger); } - }).catch(err => null); // eslint-disable-line no-unused-vars + }).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 }) => { @@ -735,6 +744,7 @@ module.exports = (app, logger) => { 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, { @@ -745,7 +755,7 @@ module.exports = (app, logger) => { role, status, initiatorUserId: req.authUser.userId, - isSSO: isSSO(project), + isSSO: util.isSSO(project), }, logger); } else if (status === INVITE_STATUS.REQUEST_REJECTED) { // send event to bus api @@ -757,7 +767,7 @@ module.exports = (app, logger) => { role, status, initiatorUserId: req.authUser.userId, - isSSO: isSSO(project), + isSSO: util.isSSO(project), }, logger); } else { // send event to bus api @@ -768,7 +778,7 @@ module.exports = (app, logger) => { role, status, initiatorUserId: req.authUser.userId, - isSSO: isSSO(project), + isSSO: util.isSSO(project), }, logger); } }).catch(err => null); // eslint-disable-line no-unused-vars diff --git a/src/routes/projectMemberInvites/update.spec.js b/src/routes/projectMemberInvites/update.spec.js index e5ca3565..6256e5fd 100644 --- a/src/routes/projectMemberInvites/update.spec.js +++ b/src/routes/projectMemberInvites/update.spec.js @@ -366,14 +366,12 @@ describe('Project member invite update', () => { projectName: project1.name, userId: invite1.userId, initiatorUserId: 40051331, - isSSO: false, })).should.be.true; createEventSpy.thirdCall.calledWith(BUS_API_EVENT.PROJECT_TEAM_UPDATED, sinon.match({ projectId: project1.id, projectName: project1.name, userId: invite1.userId, initiatorUserId: 40051331, - isSSO: false, })).should.be.true; done(); });