Skip to content

Commit e1a6edd

Browse files
author
vikasrohit
authored
Merge pull request #14 from appirio-tech/dev
Promoting to Prod
2 parents 0524e1f + da7e9a8 commit e1a6edd

File tree

7 files changed

+127
-27
lines changed

7 files changed

+127
-27
lines changed

circle.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ deployment:
2121
production:
2222
branch: master
2323
commands:
24-
- ./deploy/eb-deploy.sh tc-connect2sf PROD $CIRCLE_BUILD_NUM
24+
- ./deploy/eb-deploy.sh tc-connect2sf PROD $CIRCLE_BUILD_NUM

consumer/README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,14 @@ Use following JSON for testing
176176
```
177177
{
178178
"id": 1,
179+
"status": "draft",
180+
"details": {
181+
"utm": {
182+
"code": "123"
183+
}
184+
},
185+
"directProjectId": 5001,
186+
"cancelReason":null,
179187
"members": [
180188
{
181189
"userId": 40135978,
@@ -195,7 +203,14 @@ Use following JSON for testing
195203
},
196204
"updated": {
197205
"id": 1,
198-
"status": "active"
206+
"status": "active",
207+
"directProjectId": 6001,
208+
"cancelReason": "Spam",
209+
"details": {
210+
"utm": {
211+
"code": "123"
212+
}
213+
}
199214
}
200215
}
201216
```

consumer/src/scheduled-worker.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ process.once('SIGINT', () => {
2525
});
2626

2727
let EVENT_HANDLERS = {
28-
[EVENT.ROUTING_KEY.PROJECT_DRAFT_CREATED]: ConsumerService.processProjectCreated
29-
// [EVENT.ROUTING_KEY.PROJECT_UPDATED]: ConsumerService.processProjectUpdated
28+
[EVENT.ROUTING_KEY.PROJECT_DRAFT_CREATED]: ConsumerService.processProjectCreated,
29+
[EVENT.ROUTING_KEY.PROJECT_UPDATED]: ConsumerService.processProjectUpdated
3030
}
3131

3232
function close() {

consumer/src/services/ConsumerService.js

Lines changed: 49 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,28 @@ const projectUpdatedSchema = Joi.object().keys({
3434
}).required()
3535
}).unknown(true);
3636

37+
function getUpdatedLeadFieldData(projectUpdated) {
38+
const updatedLead = {};
39+
40+
if (projectUpdated.status) {
41+
updatedLead.TC_Connect_Project_Status__c = projectUpdated.status;
42+
}
43+
44+
if (projectUpdated.cancelReason) {
45+
updatedLead.TC_Connect_Cancel_Reason__c = projectUpdated.cancelReason;
46+
}
47+
48+
if (projectUpdated.details) {
49+
updatedLead.Ref_Code__c = _.get(projectUpdated,"details.utm.code", "");
50+
}
51+
if (projectUpdated.directProjectId) {
52+
updatedLead.TC_Connect_Direct_Project_Id__c = _.get(projectUpdated, "directProjectId","");
53+
}
54+
55+
return updatedLead;
56+
}
57+
58+
3759
class ConsumerService {
3860

3961
/**
@@ -65,6 +87,10 @@ class ConsumerService {
6587
Company: company,
6688
OwnerId: config.ownerId,
6789
TC_Connect_Project_Id__c: project.id,
90+
TC_Connect_Project_Status__c: _.get(project,"status",""),
91+
Ref_Code__c: _.get(project, "details.utm.code",""),
92+
TC_Connect_Direct_Project_Id__c: _.get(project, "directProjectId",""),
93+
TC_Connect_Cancel_Reason__c: _.get(project,"cancelReason","")
6894
};
6995
return SalesforceService.createObject('Lead', lead, accessToken, instanceUrl)
7096
.then((leadId) => {
@@ -84,6 +110,7 @@ class ConsumerService {
84110
});
85111
}
86112

113+
87114
/**
88115
* Handle created/launched project
89116
* @param {Object} projectEvent the project
@@ -92,29 +119,40 @@ class ConsumerService {
92119
processProjectUpdated(logger, projectEvent) {
93120
logger.debug(projectEvent)
94121
var project = projectEvent.original;
122+
var projectUpdated = projectEvent.updated;
123+
124+
95125
return Promise.all([
96126
ConfigurationService.getSalesforceCampaignId(),
97127
SalesforceService.authenticate(),
98128
]).then((responses) => {
99129
const campaignId = responses[0];
100130
const { accessToken, instanceUrl } = responses[1];
131+
101132
// queries existing lead for the project
102-
let sql = `SELECT id FROM Lead WHERE TC_Connect_Project_Id__c = '${project.id}'`;
133+
let sql = `SELECT id,IsConverted FROM Lead WHERE TC_Connect_Project_Id__c = '${project.id}'`;
103134
return SalesforceService.query(sql, accessToken, instanceUrl)
104135
.then((response) => {
105136
const {records: [lead]} = response;
106137
if (!lead) {
107-
throw new UnprocessableError(`Cannot find Lead with TC_Connect_Project_Id__c = '${project.id}'`);
138+
throw new UnprocessableError(`Cannot find Lead with TC_Connect_Project_Id__c = '${project.id}'`);
139+
}
140+
141+
const leadUpdate = getUpdatedLeadFieldData(projectUpdated);
142+
143+
if (lead.IsConverted != true && !_.isEmpty(leadUpdate)) {
144+
return SalesforceService.updateObject(lead.Id, 'Lead', leadUpdate, accessToken, instanceUrl);
108145
}
109-
sql = `SELECT id FROM CampaignMember WHERE LeadId = '${lead.Id}' AND CampaignId ='${campaignId}'`;
110-
return SalesforceService.query(sql, accessToken, instanceUrl)
111-
.then((response) => {
112-
const {records: [member]} = response;
113-
if (!member) {
114-
throw new UnprocessableError(`Cannot find CampaignMember for Lead.TC_Connect_Project_Id__c = '${project.id}'`);
115-
}
116-
return SalesforceService.deleteObject('CampaignMember', member.Id, accessToken, instanceUrl);
117-
})
146+
147+
// sql = `SELECT id FROM CampaignMember WHERE LeadId = '${lead.Id}' AND CampaignId ='${campaignId}'`;
148+
// return SalesforceService.query(sql, accessToken, instanceUrl)
149+
// .then((response) => {
150+
// const {records: [member]} = response;
151+
// if (!member) {
152+
// throw new UnprocessableError(`Cannot find CampaignMember for Lead.TC_Connect_Project_Id__c = '${project.id}'`);
153+
// }
154+
// return SalesforceService.deleteObject('CampaignMember', member.Id, accessToken, instanceUrl);
155+
// })
118156
})
119157
});
120158
}

consumer/src/services/SalesforceService.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ const createObjectSchema = {
2424
instanceUrl: Joi.string().required(),
2525
};
2626

27+
const updateObjectSchema = {
28+
id: Joi.string().required(),
29+
type: Joi.string().required(),
30+
params: Joi.object().required(),
31+
accessToken: Joi.string().required(),
32+
instanceUrl: Joi.string().required(),
33+
};
34+
2735
const deleteObjectSchema = {
2836
type: Joi.string().required(),
2937
id: Joi.string().required(),
@@ -86,6 +94,26 @@ class SalesforceService {
8694
.then((res) => res.body.id);
8795
}
8896

97+
/**
98+
* Update an existing object
99+
* @param {String} type the type name
100+
* @param {String} params the object properties
101+
* @param {String} accessToken the access token
102+
* @param {String} instanceUrl the salesforce instance url
103+
* @returns {String} the updated object id
104+
*/
105+
@logAndValidate(['id','type', 'params', 'accessToken', 'instanceUrl'], updateObjectSchema)
106+
updateObject(id, type, params, accessToken, instanceUrl) {
107+
return request
108+
.patch(`${instanceUrl}/services/data/v37.0/sobjects/${type}/${id}`)
109+
.set({
110+
authorization: `Bearer ${accessToken}`,
111+
})
112+
.send(params)
113+
.end();
114+
}
115+
116+
89117
/**
90118
* Run the query statement
91119
* @param {String} sql the Saleforce sql statement

consumer/src/worker.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ process.once('SIGINT', () => {
2323
});
2424

2525
let EVENT_HANDLERS = {
26-
[EVENT.ROUTING_KEY.PROJECT_DRAFT_CREATED]: ConsumerService.processProjectCreated
27-
// [EVENT.ROUTING_KEY.PROJECT_UPDATED]: ConsumerService.processProjectUpdated
26+
[EVENT.ROUTING_KEY.PROJECT_DRAFT_CREATED]: ConsumerService.processProjectCreated,
27+
[EVENT.ROUTING_KEY.PROJECT_UPDATED]: ConsumerService.processProjectUpdated
2828
}
2929

3030
export function initHandlers(handlers) {

consumer/test/ConsumerService.spec.js

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,15 @@ describe('ConsumerService', () => {
2424
instanceUrl: 'http://fake-domain',
2525
};
2626
const userId = 40135978;
27+
2728
const project = {
2829
id: 1,
30+
details: {
31+
utm: {
32+
code: "123"
33+
}
34+
},
35+
cancelReason: null,
2936
members: [
3037
{
3138
id: 1234,
@@ -42,7 +49,8 @@ describe('ConsumerService', () => {
4249
},
4350
updated: {
4451
id: 1,
45-
status: 'active'
52+
status: 'active',
53+
cancelReason: null
4654
}
4755
}
4856
let sandbox;
@@ -64,6 +72,7 @@ describe('ConsumerService', () => {
6472

6573
describe('processProjectCreated', () => {
6674
it('should process project successfully', async() => {
75+
6776
const expectedLead = {
6877
FirstName: 'john',
6978
LastName: 'doe',
@@ -72,6 +81,10 @@ describe('ConsumerService', () => {
7281
Company: 'Unknown',
7382
OwnerId: config.ownerId,
7483
TC_Connect_Project_Id__c: 1,
84+
Ref_Code__c: '123',
85+
TC_Connect_Project_Status__c: '',
86+
TC_Connect_Cancel_Reason__c: null,
87+
TC_Connect_Direct_Project_Id__c: ''
7588
};
7689

7790
const expectedCampaignMember = {
@@ -132,21 +145,26 @@ describe('ConsumerService', () => {
132145
describe('processProjectUpdated', () => {
133146
it('should process project successfully', async() => {
134147
const memberId = 'member-id';
135-
const leadSql = `SELECT id FROM Lead WHERE TC_Connect_Project_Id__c = '${project.id}'`;
136-
const memberSql = `SELECT id FROM CampaignMember WHERE LeadId = '${leadId}' AND CampaignId ='${sfCampaignId}'`;
148+
const leadSql = `SELECT id,IsConverted FROM Lead WHERE TC_Connect_Project_Id__c = '${project.id}'`;
149+
// const memberSql = `SELECT id FROM CampaignMember WHERE LeadId = '${leadId}' AND CampaignId ='${sfCampaignId}'`;
137150

138151
const queryStub = sandbox.stub(SalesforceService, 'query');
152+
153+
139154
queryStub.onCall(0)
140155
.returns(Promise.resolve({ records: [{ Id: leadId }] }));
141-
queryStub.onCall(1)
142-
.returns(Promise.resolve({ records: [{ Id: memberId }] }));
143-
const deleteObjectStub = sandbox.stub(SalesforceService, 'deleteObject');
156+
// queryStub.onCall(1)
157+
// .returns(Promise.resolve({ records: [{ Id: memberId }] }));
158+
// const deleteObjectStub = sandbox.stub(SalesforceService, 'deleteObject');
159+
160+
const updateStub = sandbox.stub(SalesforceService,'updateObject', async() => {});
161+
144162

145163
await ConsumerService.processProjectUpdated(logger, projectUpdatePaylod);
146164
queryStub.should.have.been.calledWith(leadSql, sfAuth.accessToken, sfAuth.instanceUrl);
147-
queryStub.should.have.been.calledWith(memberSql, sfAuth.accessToken, sfAuth.instanceUrl);
148-
deleteObjectStub.should.have.been.calledWith('CampaignMember', memberId, sfAuth.accessToken,
149-
sfAuth.instanceUrl);
165+
// queryStub.should.have.been.calledWith(memberSql, sfAuth.accessToken, sfAuth.instanceUrl);
166+
// deleteObjectStub.should.have.been.calledWith('CampaignMember', memberId, sfAuth.accessToken,
167+
// sfAuth.instanceUrl);
150168
});
151169

152170
it('should throw UnprocessableError if Lead cannot be found', async() => {
@@ -158,7 +176,8 @@ describe('ConsumerService', () => {
158176
queryStub.should.have.been.called;
159177
});
160178

161-
it('should throw UnprocessableError if CampaignMember cannot be found', async() => {
179+
// Not a valid use case any more
180+
xit('should throw UnprocessableError if CampaignMember cannot be found', async() => {
162181
const queryStub = sandbox.stub(SalesforceService, 'query');
163182
queryStub.onCall(0)
164183
.returns(Promise.resolve({ records: [{ Id: leadId }] }));

0 commit comments

Comments
 (0)