From 7aef5b29ab7f260c4c6256aed4d74bf7462e0922 Mon Sep 17 00:00:00 2001 From: Vikas Agarwal Date: Tue, 11 Feb 2020 17:16:55 +0530 Subject: [PATCH 01/11] Reading new SFDC events to act appropriately --- consumer/src/services/ProjectService.js | 6 +++--- consumer/test/ProjectService.spec.js | 2 +- consumer/test/salesforce-worker.spec.js | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/consumer/src/services/ProjectService.js b/consumer/src/services/ProjectService.js index b19f710..d5ed53c 100644 --- a/consumer/src/services/ProjectService.js +++ b/consumer/src/services/ProjectService.js @@ -52,7 +52,7 @@ const getProject = (projectId) => { * * @return {Promise} promise resolved to the updated project */ -const activateProject = (projectId) => { +const updateProjectStatus = (projectId, status='active') => { console.log(`AUTH0_CLIENT_ID: ${config.AUTH0_CLIENT_ID.substring(0, 5)}`); console.log(`AUTH0_CLIENT_SECRET: ${config.AUTH0_CLIENT_SECRET.substring(0, 5)}`); console.log(`AUTH0_URL: ${config.AUTH0_URL}`); @@ -64,7 +64,7 @@ const activateProject = (projectId) => { .patch(`${config.projectApi.url}/projects/${projectId}`) .set('accept', 'application/json') .set('Authorization', `Bearer ${token}`) - .send({ param : { status : 'active' } }) + .send({ param : { status } }) .then((res) => { if (!_.get(res, 'body.result.success')) { throw new Error(`Failed to activate project with id: ${projectId}`); @@ -91,5 +91,5 @@ const activateProject = (projectId) => { module.exports = { getProject, - activateProject + updateProjectStatus }; \ No newline at end of file diff --git a/consumer/test/ProjectService.spec.js b/consumer/test/ProjectService.spec.js index 1f8c21b..e0de651 100644 --- a/consumer/test/ProjectService.spec.js +++ b/consumer/test/ProjectService.spec.js @@ -93,7 +93,7 @@ describe('ProjectService', () => { }) .patch('/projects/1234') .reply(200, getProjectResponse); - const user = await ProjectService.activateProject(1234); + const user = await ProjectService.updateProjectStatus(1234); expect(user).to.deep.equal(getProjectResponse.result.content); fakeHttp.done(); }); diff --git a/consumer/test/salesforce-worker.spec.js b/consumer/test/salesforce-worker.spec.js index 19efdb7..0e29426 100644 --- a/consumer/test/salesforce-worker.spec.js +++ b/consumer/test/salesforce-worker.spec.js @@ -14,9 +14,9 @@ describe('salesforce-worker', () => { } } describe('consumeMessage', () => { - let activateProjectSpy; + let updateProjectStatusSpy; beforeEach(() => { - activateProjectSpy = ProjectService.activateProject = sinon.spy(); + updateProjectStatusSpy = ProjectService.updateProjectStatus = sinon.spy(); }); /** @@ -29,7 +29,7 @@ describe('salesforce-worker', () => { it('should consume and active project successfully', (done) => { invokeConsume(done); - activateProjectSpy.should.have.been.calledWith(1234); + updateProjectStatusSpy.should.have.been.calledWith(1234); done(); }); }); From 30d4acc1cd7a10652478b24a257f819bf07b9f39 Mon Sep 17 00:00:00 2001 From: Vikas Agarwal Date: Tue, 11 Feb 2020 17:17:05 +0530 Subject: [PATCH 02/11] Missing file from the last commit --- consumer/src/salesforce-worker.js | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/consumer/src/salesforce-worker.js b/consumer/src/salesforce-worker.js index 2092836..e7f6ee6 100644 --- a/consumer/src/salesforce-worker.js +++ b/consumer/src/salesforce-worker.js @@ -23,20 +23,33 @@ export function consumeMessage(message) { debug('Got Connect_SFDC__e', message); const payload = _.get(message, 'payload'); const eventType = _.get(payload, 'Type__c'); + const original = JSON.parse(_.get(payload, 'Original__c')); + const updated = JSON.parse(_.get(payload, 'Updated__c')); + let statusToBe = null; if (eventType === 'billingAccount.updated') { - const original = JSON.parse(_.get(payload, 'Original__c')); - const updated = JSON.parse(_.get(payload, 'Updated__c')); const oldStatus = _.get(original, 'Active__c'); const updatedStatus = _.get(updated, 'Active__c'); debug(`${oldStatus} === ${updatedStatus}`); if (oldStatus !== updatedStatus && updatedStatus === true) { - const projectId = _.get(updated, 'TC_Connect_Project_ID__c'); - debug(`Activating project with id ${projectId}`); - // TODO retrieve project id from the payload - if (projectId) { - ProjectService.activateProject(projectId); - } + statusToBe = 'active' } + } else if (eventType === 'opportunity.won') { + // TODO + } else if (eventType === 'opportunity.lost') { + // Cancel connect project + statusToBe = 'cancelled' + } else if (eventType === 'lead.disqualified') { + // Cancel the project + statusToBe = 'cancelled' + } else if (eventType === 'opportunity.create') { + // Move to reviewed status + statusToBe = 'reviewed' + } + + const projectId = _.get(updated, 'TC_Connect_Project_ID__c'); + debug(`Updating status to ${statusToBe} project with id ${projectId}`); + if (projectId) { + ProjectService.updateProjectStatus(projectId, statusToBe); } } From 71980671e6a04afa57a75bb6e53cf639fc8924b6 Mon Sep 17 00:00:00 2001 From: Vikas Agarwal Date: Tue, 11 Feb 2020 17:17:35 +0530 Subject: [PATCH 03/11] Temporary deployable feature branch --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index aca5407..a0bc049 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -94,7 +94,7 @@ workflows: - test filters: branches: - only: ['dev'] + only: ['dev', 'feature/opty_lead_status_sync_with_project'] - deployProd: context : org-global requires: From c5538e5235e9120ce21cadeb07baf5aed4033e1d Mon Sep 17 00:00:00 2001 From: Vikas Agarwal Date: Thu, 13 Feb 2020 12:15:41 +0530 Subject: [PATCH 04/11] Adding debug statements More null point handler --- consumer/src/salesforce-worker.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/consumer/src/salesforce-worker.js b/consumer/src/salesforce-worker.js index e7f6ee6..9368632 100644 --- a/consumer/src/salesforce-worker.js +++ b/consumer/src/salesforce-worker.js @@ -45,10 +45,10 @@ export function consumeMessage(message) { // Move to reviewed status statusToBe = 'reviewed' } - + debug('updated', updated); const projectId = _.get(updated, 'TC_Connect_Project_ID__c'); debug(`Updating status to ${statusToBe} project with id ${projectId}`); - if (projectId) { + if (statusToBe && projectId) { ProjectService.updateProjectStatus(projectId, statusToBe); } } From 3b696ecfc17086191f845f110aa9f0d929f03fa2 Mon Sep 17 00:00:00 2001 From: Vikas Agarwal Date: Thu, 13 Feb 2020 12:42:28 +0530 Subject: [PATCH 05/11] Fixed case sensitivity of connect project id field --- consumer/src/salesforce-worker.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/consumer/src/salesforce-worker.js b/consumer/src/salesforce-worker.js index 9368632..38750e7 100644 --- a/consumer/src/salesforce-worker.js +++ b/consumer/src/salesforce-worker.js @@ -45,10 +45,13 @@ export function consumeMessage(message) { // Move to reviewed status statusToBe = 'reviewed' } - debug('updated', updated); - const projectId = _.get(updated, 'TC_Connect_Project_ID__c'); - debug(`Updating status to ${statusToBe} project with id ${projectId}`); + let projectId = _.get(updated, 'TC_Connect_Project_ID__c'); + if (!projectId) { + projectId = _.get(updated, 'TC_Connect_Project_Id__c'); + } + debug(`Status to be updated: ${statusToBe} for project with id ${projectId}`); if (statusToBe && projectId) { + debug(`Updating status to ${statusToBe} project with id ${projectId}`); ProjectService.updateProjectStatus(projectId, statusToBe); } } From d3b21cc2f6b8a4da41f7fcd6fb8fbc3a4092cff2 Mon Sep 17 00:00:00 2001 From: Vikas Agarwal Date: Mon, 17 Feb 2020 15:06:21 +0530 Subject: [PATCH 06/11] V5 request format for projects api call --- consumer/src/services/ProjectService.js | 14 +++++------ consumer/test/ProjectService.spec.js | 32 ++++++++++--------------- 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/consumer/src/services/ProjectService.js b/consumer/src/services/ProjectService.js index d5ed53c..b0f8be2 100644 --- a/consumer/src/services/ProjectService.js +++ b/consumer/src/services/ProjectService.js @@ -26,13 +26,13 @@ const getProject = (projectId) => { .set('accept', 'application/json') .set('authorization', `Bearer ${token}`) .then((res) => { - if (!_.get(res, 'body.result.success')) { + if (res.status !== 200) { throw new Error(`Failed to get project details of project id: ${projectId}`); } - const project = _.get(res, 'body.result.content'); + const project = _.get(res, 'body'); return project; }).catch((err) => { - const errorDetails = _.get(err, 'response.body.result.content.message'); + const errorDetails = _.get(err, 'response.body'); throw new Error( `Failed to get project details of project id: ${projectId}.` + (errorDetails ? ' Server response: ' + errorDetails : '') @@ -64,19 +64,19 @@ const updateProjectStatus = (projectId, status='active') => { .patch(`${config.projectApi.url}/projects/${projectId}`) .set('accept', 'application/json') .set('Authorization', `Bearer ${token}`) - .send({ param : { status } }) + .send({ status }) .then((res) => { - if (!_.get(res, 'body.result.success')) { + if (res.status !== 200) { throw new Error(`Failed to activate project with id: ${projectId}`); } - const project = _.get(res, 'body.result.content'); + const project = _.get(res, 'body'); if (project) { console.log(`Successfully activated the project with id ${projectId}`); } return project; }).catch((err) => { console.log(err); - const errorDetails = _.get(err, 'response.body.result.content.message'); + const errorDetails = _.get(err, 'response.body'); throw new Error( `Failed to update project with id: ${projectId}.` + (errorDetails ? ' Server response: ' + errorDetails : '') diff --git a/consumer/test/ProjectService.spec.js b/consumer/test/ProjectService.spec.js index e0de651..480ad5b 100644 --- a/consumer/test/ProjectService.spec.js +++ b/consumer/test/ProjectService.spec.js @@ -31,22 +31,13 @@ const authenticateResponse = { }; const getProjectResponse = { - id: '-88f3803:1557f8485b0:-b0a', - result: { - success: true, - status: 200, - metadata: null, - content: { - id: '265522', - modifiedBy: null, - modifiedAt: '2016-06-01T16:57:47.000Z', - createdBy: null, - createdAt: '2002-02-06T18:06:40.000Z', - status: 'active', - name: 'Test Project', - }, - }, - version: 'v4', + id: '265522', + modifiedBy: null, + modifiedAt: '2016-06-01T16:57:47.000Z', + createdBy: null, + createdAt: '2002-02-06T18:06:40.000Z', + status: 'active', + name: 'Test Project', }; @@ -80,8 +71,8 @@ describe('ProjectService', () => { }) .get('/projects/1234') .reply(200, getProjectResponse); - const user = await ProjectService.getProject(1234); - expect(user).to.deep.equal(getProjectResponse.result.content); + const project = await ProjectService.getProject(1234); + expect(project).to.deep.equal(getProjectResponse); fakeHttp.done(); }); @@ -93,8 +84,9 @@ describe('ProjectService', () => { }) .patch('/projects/1234') .reply(200, getProjectResponse); - const user = await ProjectService.updateProjectStatus(1234); - expect(user).to.deep.equal(getProjectResponse.result.content); + const project = await ProjectService.updateProjectStatus(1234); + console.log(project, 'project') + expect(project).to.deep.equal(getProjectResponse); fakeHttp.done(); }); }); From edb634ac60a163a336516394569f03c8efe10de9 Mon Sep 17 00:00:00 2001 From: Vikas Agarwal Date: Mon, 17 Feb 2020 15:55:58 +0530 Subject: [PATCH 07/11] Handling cancel reason for the cases where we have to cancel the project --- consumer/src/salesforce-worker.js | 5 ++++- consumer/src/services/ProjectService.js | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/consumer/src/salesforce-worker.js b/consumer/src/salesforce-worker.js index 38750e7..f165d5e 100644 --- a/consumer/src/salesforce-worker.js +++ b/consumer/src/salesforce-worker.js @@ -26,6 +26,7 @@ export function consumeMessage(message) { const original = JSON.parse(_.get(payload, 'Original__c')); const updated = JSON.parse(_.get(payload, 'Updated__c')); let statusToBe = null; + let statusChangeReason = null; if (eventType === 'billingAccount.updated') { const oldStatus = _.get(original, 'Active__c'); const updatedStatus = _.get(updated, 'Active__c'); @@ -38,9 +39,11 @@ export function consumeMessage(message) { } else if (eventType === 'opportunity.lost') { // Cancel connect project statusToBe = 'cancelled' + statusChangeReason = _.get(updated, 'Loss_Description__c', 'Opportunity Lost'); } else if (eventType === 'lead.disqualified') { // Cancel the project statusToBe = 'cancelled' + statusChangeReason = _.get(updated, 'Loss_Description__c', 'Lead Disqualified'); } else if (eventType === 'opportunity.create') { // Move to reviewed status statusToBe = 'reviewed' @@ -52,7 +55,7 @@ export function consumeMessage(message) { debug(`Status to be updated: ${statusToBe} for project with id ${projectId}`); if (statusToBe && projectId) { debug(`Updating status to ${statusToBe} project with id ${projectId}`); - ProjectService.updateProjectStatus(projectId, statusToBe); + ProjectService.updateProjectStatus(projectId, statusToBe, statusChangeReason); } } diff --git a/consumer/src/services/ProjectService.js b/consumer/src/services/ProjectService.js index b0f8be2..9f42bb8 100644 --- a/consumer/src/services/ProjectService.js +++ b/consumer/src/services/ProjectService.js @@ -52,7 +52,7 @@ const getProject = (projectId) => { * * @return {Promise} promise resolved to the updated project */ -const updateProjectStatus = (projectId, status='active') => { +const updateProjectStatus = (projectId, status='active', changeReason) => { console.log(`AUTH0_CLIENT_ID: ${config.AUTH0_CLIENT_ID.substring(0, 5)}`); console.log(`AUTH0_CLIENT_SECRET: ${config.AUTH0_CLIENT_SECRET.substring(0, 5)}`); console.log(`AUTH0_URL: ${config.AUTH0_URL}`); @@ -64,7 +64,7 @@ const updateProjectStatus = (projectId, status='active') => { .patch(`${config.projectApi.url}/projects/${projectId}`) .set('accept', 'application/json') .set('Authorization', `Bearer ${token}`) - .send({ status }) + .send({ status, cancelReason: changeReason }) .then((res) => { if (res.status !== 200) { throw new Error(`Failed to activate project with id: ${projectId}`); From 59ac0b35a25766e18fda0b4639e979cd05a24202 Mon Sep 17 00:00:00 2001 From: Vikas Agarwal Date: Mon, 17 Feb 2020 17:01:52 +0530 Subject: [PATCH 08/11] Debug statements updates Fixed calling the project api for non cancel status without cancel reason. --- consumer/src/services/ProjectService.js | 28 ++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/consumer/src/services/ProjectService.js b/consumer/src/services/ProjectService.js index 9f42bb8..7c7efb8 100644 --- a/consumer/src/services/ProjectService.js +++ b/consumer/src/services/ProjectService.js @@ -6,6 +6,8 @@ const request = require('superagent'); const config = require('config'); const _ = require('lodash'); +const debug = require('debug')('app:project-service'); + /** * Get project details * @@ -14,11 +16,8 @@ const _ = require('lodash'); * @return {Promise} promise resolved to project details */ const getProject = (projectId) => { - console.log(`AUTH0_CLIENT_ID: ${config.AUTH0_CLIENT_ID.substring(0, 5)}`); - console.log(`AUTH0_CLIENT_SECRET: ${config.AUTH0_CLIENT_SECRET.substring(0, 5)}`); - console.log(`AUTH0_URL: ${config.AUTH0_URL}`); - console.log(`AUTH0_AUDIENCE: ${config.AUTH0_AUDIENCE}`); - console.log(`AUTH0_PROXY_SERVER_URL: ${config.AUTH0_PROXY_SERVER_URL}`); + debug(`AUTH0_CLIENT_ID: ${config.AUTH0_CLIENT_ID.substring(0, 5)}`); + debug(`AUTH0_CLIENT_SECRET: ${config.AUTH0_CLIENT_SECRET.substring(0, 5)}`); return M2m.getMachineToken(config.AUTH0_CLIENT_ID, config.AUTH0_CLIENT_SECRET) .then((token) => ( request @@ -53,29 +52,30 @@ const getProject = (projectId) => { * @return {Promise} promise resolved to the updated project */ const updateProjectStatus = (projectId, status='active', changeReason) => { - console.log(`AUTH0_CLIENT_ID: ${config.AUTH0_CLIENT_ID.substring(0, 5)}`); - console.log(`AUTH0_CLIENT_SECRET: ${config.AUTH0_CLIENT_SECRET.substring(0, 5)}`); - console.log(`AUTH0_URL: ${config.AUTH0_URL}`); - console.log(`AUTH0_AUDIENCE: ${config.AUTH0_AUDIENCE}`); - console.log(`AUTH0_PROXY_SERVER_URL: ${config.AUTH0_PROXY_SERVER_URL}`); + debug(`AUTH0_CLIENT_ID: ${config.AUTH0_CLIENT_ID.substring(0, 5)}`); + debug(`AUTH0_CLIENT_SECRET: ${config.AUTH0_CLIENT_SECRET.substring(0, 5)}`); + const updatedProject = { status }; + if (changeReason) { + updatedProject.cancelReason = changeReason; + } return M2m.getMachineToken(config.AUTH0_CLIENT_ID, config.AUTH0_CLIENT_SECRET) .then((token) => ( request .patch(`${config.projectApi.url}/projects/${projectId}`) .set('accept', 'application/json') .set('Authorization', `Bearer ${token}`) - .send({ status, cancelReason: changeReason }) + .send(updatedProject) .then((res) => { if (res.status !== 200) { - throw new Error(`Failed to activate project with id: ${projectId}`); + throw new Error(`Failed to update project with id: ${projectId}`); } const project = _.get(res, 'body'); if (project) { - console.log(`Successfully activated the project with id ${projectId}`); + debug(`Successfully updated the project ${projectId} with status ${status}`); } return project; }).catch((err) => { - console.log(err); + debug(err); const errorDetails = _.get(err, 'response.body'); throw new Error( `Failed to update project with id: ${projectId}.` + From 1528630f85eebd137d756959e88b4dd158e93001 Mon Sep 17 00:00:00 2001 From: Vikas Agarwal Date: Tue, 18 Feb 2020 11:22:06 +0530 Subject: [PATCH 09/11] Handled the lead.qualified logic similar to opty.create --- consumer/src/salesforce-worker.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/consumer/src/salesforce-worker.js b/consumer/src/salesforce-worker.js index f165d5e..9195d8e 100644 --- a/consumer/src/salesforce-worker.js +++ b/consumer/src/salesforce-worker.js @@ -47,6 +47,9 @@ export function consumeMessage(message) { } else if (eventType === 'opportunity.create') { // Move to reviewed status statusToBe = 'reviewed' + } else if (eventType === 'lead.qualified') { + // Move to reviewed status + statusToBe = 'reviewed' } let projectId = _.get(updated, 'TC_Connect_Project_ID__c'); if (!projectId) { From 2d37b93c15a35c12eedb9806b52c92fe52cca6f9 Mon Sep 17 00:00:00 2001 From: Vikas Agarwal Date: Tue, 18 Feb 2020 12:20:24 +0530 Subject: [PATCH 10/11] Fixed the field to pick the correct disqualify reason for the lead --- consumer/src/salesforce-worker.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/consumer/src/salesforce-worker.js b/consumer/src/salesforce-worker.js index 9195d8e..447e630 100644 --- a/consumer/src/salesforce-worker.js +++ b/consumer/src/salesforce-worker.js @@ -43,7 +43,7 @@ export function consumeMessage(message) { } else if (eventType === 'lead.disqualified') { // Cancel the project statusToBe = 'cancelled' - statusChangeReason = _.get(updated, 'Loss_Description__c', 'Lead Disqualified'); + statusChangeReason = _.get(updated, 'Disqualified_Reason__c', 'Lead Disqualified'); } else if (eventType === 'opportunity.create') { // Move to reviewed status statusToBe = 'reviewed' From f9b84ca0cc1596313e7075c4750d6afc92684a92 Mon Sep 17 00:00:00 2001 From: Vikas Agarwal Date: Thu, 27 Feb 2020 11:41:18 +0530 Subject: [PATCH 11/11] Removed branch from deployable branch list --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a0bc049..aca5407 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -94,7 +94,7 @@ workflows: - test filters: branches: - only: ['dev', 'feature/opty_lead_status_sync_with_project'] + only: ['dev'] - deployProd: context : org-global requires: