Skip to content

Commit 95f29b0

Browse files
author
Parth Shah
committed
2 parents 8def810 + 484505a commit 95f29b0

18 files changed

+171
-19
lines changed

.ebextensions/01-environment-variables.config

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,27 @@ option_settings:
5353
- namespace: aws:elasticbeanstalk:application:environment
5454
option_name: AWS_SECRET_ACCESS_KEY
5555
value: TBD
56+
- namespace: aws:elasticbeanstalk:application:environment
57+
option_name: SALESFORCE_WEB_TO_LEAD_URL
58+
value: https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8
59+
- namespace: aws:elasticbeanstalk:application:environment
60+
option_name: SALESFORCE_ORG_ID
61+
value: TBD
62+
- namespace: aws:elasticbeanstalk:application:environment
63+
option_name: SALESFORCE_LEAD_PROJECT_NAME
64+
value: TBD
65+
- namespace: aws:elasticbeanstalk:application:environment
66+
option_name: SALESFORCE_LEAD_PROJECT_DESC
67+
value: TBD
68+
- namespace: aws:elasticbeanstalk:application:environment
69+
option_name: SALESFORCE_LEAD_PROJECT_LINK
70+
value: TBD
71+
- namespace: aws:elasticbeanstalk:application:environment
72+
option_name: SALESFORCE_LEAD_PROJECT_ID
73+
value: TBD
74+
- namespace: aws:elasticbeanstalk:application:environment
75+
option_name: CONNECT_PROJECTS_URL
76+
value: TBD
77+
- namespace: aws:elasticbeanstalk:application:environment
78+
option_name: USER_SERVICE_URL
79+
value: TBD

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ config/local.js
66
logs
77
*.log
88
npm-debug.log*
9+
.DS_Store
910

1011
dist/
1112

@@ -42,3 +43,4 @@ jspm_packages
4243
!.elasticbeanstalk/config.yml
4344
!.elasticbeanstalk/*.cfg.yml
4445
!.elasticbeanstalk/*.global.yml
46+
.DS_Store

.nvmrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
5.9
1+
v6.9.4

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
FROM node:5.10.1
1+
FROM node:6.9.4
22
LABEL version="1.0"
33
LABEL description="Projects microservice"
44

@@ -9,6 +9,7 @@ RUN apt-get update && \
99
RUN apt-get install -y \
1010
ssh \
1111
python \
12+
python-dev \
1213
python-pip
1314

1415
RUN pip install awscli
@@ -23,7 +24,6 @@ COPY . /usr/src/app
2324
# Install app dependencies
2425
RUN npm install
2526

26-
2727
EXPOSE 3000
2828

2929
CMD ["npm", "start"]

config/custom-environment-variables.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@
1414
"topicServiceEndpoint": "TOPIC_SERVICE_ENDPOINT",
1515
"systemUserClientId": "SYSTEM_USER_CLIENT_ID",
1616
"systemUserClientSecret": "SYSTEM_USER_CLIENT_SECRET",
17+
"userServiceUrl": "USER_SERVICE_URL",
18+
"connectProjectsUrl": "CONNECT_PROJECTS_URL",
19+
"salesforceLead" : {
20+
"webToLeadUrl": "SALESFORCE_WEB_TO_LEAD_URL",
21+
"orgId" : "SALESFORCE_ORG_ID",
22+
"projectNameFieldId": "SALESFORCE_LEAD_PROJECT_NAME",
23+
"projectDescFieldId": "SALESFORCE_LEAD_PROJECT_DESC",
24+
"projectLinkFieldId": "SALESFORCE_LEAD_PROJECT_LINK",
25+
"projectIdFieldId" : "SALESFORCE_LEAD_PROJECT_ID"
26+
},
1727
"dbConfig": {
1828
"masterUrl": "DB_MASTER_URL",
1929
"maxPoolSize": "DB_MAX_POOL_SIZE",

config/default.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@
1818
"projectAttachmentPathSuffix": "attachments",
1919
"systemUserClientId": "",
2020
"systemUserClientSecret": "",
21+
"userServiceUrl": "",
22+
"connectProjectUrl":"",
23+
"salesforceLead" : {
24+
"webToLeadUrl": "https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8",
25+
"orgId": "",
26+
"projectNameFieldId": "",
27+
"projectDescFieldId": "",
28+
"projectLinkFieldId": "",
29+
"projectIdFieldId" : ""
30+
},
2131
"dbConfig": {
2232
"masterUrl": "",
2333
"maxPoolSize": 50,

config/sample.local.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@ if (process.env.NODE_ENV === 'test') {
1313
"fileServiceEndpoint": "https://api.topcoder-dev.com/v3/files/",
1414
"topicServiceEndpoint": "https://api.topcoder-dev.com/v4/topics/",
1515
"directProjectServiceEndpoint": "https://api.topcoder-dev.com/v3/direct",
16+
"userServiceUrl": "https://api.topcoder-dev.com/v3/users",
17+
"connectProjectsUrl": "https://connect.topcoder-dev.com/projects/",
18+
"salesforceLead" : {
19+
"webToLeadUrl": 'https://www.salesforce.com/servlet/servlet.WebToLead?encoding=UTF-8',
20+
"orgId": "00D2C0000000dO6",
21+
"projectNameFieldId": "title",
22+
"projectDescFieldId": "description",
23+
"projectLinkFieldId": "URL",
24+
"projectIdFieldId" : "00N2C000000Vxxx"
25+
},
1626
"dbConfig": {
1727
"masterUrl": "postgres://coder:mysecretpassword@dockerhost:5432/projectsdb",
1828
"maxPoolSize": 50,

local/docker-compose.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ postgres:
55
environment:
66
- POSTGRES_PASSWORD=mysecretpassword
77
- POSTGRES_USER=coder
8-
- POSTGRES_DB=tagsdb
9-
elasticsearch:
10-
image: "elasticsearch:1.5.2"
11-
ports:
12-
- "9200:9200"
13-
- "9300:9300"
8+
- POSTGRES_DB=projectsdb
9+
#elasticsearch:
10+
# image: "elasticsearch:2"
11+
# ports:
12+
# - "9200:9200"
13+
# - "9300:9300"
1414
redis:
1515
image: redis:2.8
1616
ports:

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
"version": "1.1.2",
44
"description": "Projects microservice",
55
"main": "index.js",
6+
"engines": {
7+
"node": ">=6.9"
8+
},
69
"scripts": {
7-
"test": "NODE_ENV=test ./node_modules/.bin/mocha --compilers js:babel-core/register $(find src -path '*spec.js*')",
10+
"test": "NODE_ENV=test ./node_modules/.bin/istanbul cover ./node_modules/mocha/bin/_mocha -- --compilers js:babel-core/register $(find src -path '*spec.js*')",
811
"live-test": "NODE_ENV=test ./node_modules/.bin/mocha -w --compilers js:babel-core/register $(find src -path '*spec.js*')",
912
"dev": "NODE_ENV=local PORT=8001 nodemon -w src --exec \"babel-node src --presets es2015\" | ./node_modules/.bin/bunyan",
1013
"build": "babel src -d dist --presets es2015",

src/events/projects/index.js

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import {
33
EVENT
44
} from '../../constants'
55
import util from '../../util'
6+
import config from 'config'
7+
import querystring from 'querystring'
68
import topicService from '../../services/topicService'
79

810
const _addProjectStatus = (req, logger, project) => {
@@ -29,6 +31,41 @@ const _addProjectStatus = (req, logger, project) => {
2931
return true
3032
})
3133
}
34+
35+
/**
36+
* Creates a lead in salesforce for the connect project.
37+
*
38+
* @param token JWT token of the admin user which would be used to fetch user info
39+
* @param logger logger to be used for logging
40+
* @param project connect project for which lead is to be created
41+
*
42+
* @return promise which resolves to the HTML content where salesforce web to lead form redirects
43+
*/
44+
const _addSalesforceLead = (token, logger, project) => {
45+
logger.debug('Getting topcoder user with userId: ', project.createdBy)
46+
return util.getTopcoderUser(project.createdBy, token, logger)
47+
.then((userInfo) => {
48+
var httpClient = util.getHttpClient({id: 2,log : logger})
49+
httpClient.defaults.timeout = 3000
50+
httpClient.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded'
51+
var data = {
52+
oid: config.get('salesforceLead.orgId'),
53+
first_name: userInfo.firstName,
54+
last_name: userInfo.lastName,
55+
email: userInfo.email
56+
}
57+
data[config.get('salesforceLead.projectIdFieldId')] = project.id
58+
data[config.get('salesforceLead.projectNameFieldId')] = project.name
59+
data[config.get('salesforceLead.projectDescFieldId')] = project.description
60+
data[config.get('salesforceLead.projectLinkFieldId')] = config.get('connectProjectsUrl') + project.id
61+
var body = querystring.stringify(data)
62+
var webToLeadUrl = config.get('salesforceLead.webToLeadUrl')
63+
logger.debug('initiaiting salesforce web to lead call for project: ', project.id)
64+
return httpClient.post(webToLeadUrl, body)
65+
})
66+
}
67+
68+
3269
/**
3370
* Handler for project creation event
3471
* @param {[type]} logger logger to log along with trace id
@@ -46,10 +83,13 @@ const projectCreatedHandler = (logger, msg, channel) => {
4683
authorization: `Bearer ${token}`
4784
}
4885
}
49-
return _addProjectStatus(req, logger, project)
86+
return Promise.all([
87+
_addProjectStatus(req, logger, project),
88+
_addSalesforceLead(token, logger, project).then((resp)=> logger.debug('web to lead response:', resp.status))
89+
]);
5090
})
5191
.then(() => {
52-
channel.ack(msg, true)
92+
channel.ack(msg)
5393
})
5494
.catch(err => {
5595
// don't requeue for now

src/routes/projectMembers/create.spec.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ describe('Project Members create', () => {
115115
resJson.isPrimary.should.be.truthy
116116
resJson.projectId.should.equal(project2.id)
117117
resJson.userId.should.equal(1)
118+
server.services.pubsub.publish.calledWith('project.member.added').should.be.true
118119
done()
119120
})
120121
})
@@ -138,6 +139,7 @@ describe('Project Members create', () => {
138139
resJson.isPrimary.should.be.truthy
139140
resJson.projectId.should.equal(project1.id)
140141
resJson.userId.should.equal(1)
142+
server.services.pubsub.publish.calledWith('project.member.added').should.be.true
141143
done()
142144
})
143145
})
@@ -189,6 +191,7 @@ describe('Project Members create', () => {
189191
})
190192
})
191193
var postSpy = sinon.spy(mockHttpClient, 'post')
194+
// var amqPubSpy = sinon.spy(server.services.pubsub, 'publish')
192195
sandbox.stub(util, 'getHttpClient', () => mockHttpClient )
193196
request(server)
194197
.post('/v4/projects/' + project1.id + '/members/')
@@ -209,6 +212,7 @@ describe('Project Members create', () => {
209212
resJson.projectId.should.equal(project1.id)
210213
resJson.userId.should.equal(3)
211214
postSpy.should.have.been.calledOnce
215+
server.services.pubsub.publish.calledWith('project.member.added').should.be.true
212216
done()
213217
})
214218
})

src/routes/projectMembers/delete.spec.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,13 @@ describe('Project members delete', () => {
9898
if (err) {
9999
return done(err)
100100
}
101+
var removedMember = {
102+
projectId: project1.id,
103+
userId: 40051332,
104+
role: 'copilot',
105+
isPrimary: true
106+
}
107+
server.services.pubsub.publish.calledWith('project.member.removed', sinon.match(removedMember)).should.be.true
101108
done()
102109
// models.ProjectMember
103110
// .count({where: { projectId: project1.id, deletedAt: { $eq: null } }})

src/routes/projectMembers/update.spec.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ describe('Project members update', () => {
155155
})
156156
.send({
157157
param: {
158-
"role": "copilot"
158+
"role": "customer"
159159
}
160160
})
161161
.expect('Content-Type', /json/)
@@ -166,10 +166,11 @@ describe('Project members update', () => {
166166
}
167167
const resJson = res.body.result.content
168168
should.exist(resJson)
169-
resJson.role.should.equal('copilot')
169+
resJson.role.should.equal('customer')
170170
resJson.isPrimary.should.be.true
171171
new Date(resJson.updatedAt).valueOf().should.be.equal(new Date(member2.updatedAt).valueOf())
172-
resJson.updatedBy.should.equal(1)
172+
resJson.updatedBy.should.equal(40051332)
173+
server.services.pubsub.publish.calledWith('project.member.updated').should.be.true
173174
done()
174175
})
175176

@@ -195,6 +196,7 @@ describe('Project members update', () => {
195196
resJson.role.should.equal(body.param.role)
196197
resJson.isPrimary.should.be.false
197198
resJson.updatedBy.should.equal(40051332)
199+
server.services.pubsub.publish.calledWith('project.member.updated').should.be.true
198200
done()
199201
})
200202
}
@@ -237,6 +239,7 @@ describe('Project members update', () => {
237239
resJson.isPrimary.should.be.false
238240
resJson.updatedBy.should.equal(40051332)
239241
deleteSpy.should.have.been.calledOnce
242+
server.services.pubsub.publish.calledWith('project.member.removed').should.be.true
240243
done()
241244
})
242245
})

src/routes/projects/create.spec.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ describe('Project create', () => {
8888
const result = res.body.result
8989
result.success.should.be.truthy
9090
result.status.should.equal(201)
91+
server.services.pubsub.publish.calledWith('project.draft-created').should.be.true
9192
done()
9293
})
9394
})
@@ -137,6 +138,7 @@ describe('Project create', () => {
137138
resJson.bookmarks.should.have.lengthOf(1)
138139
resJson.bookmarks[0].title.should.be.eql('title1')
139140
resJson.bookmarks[0].address.should.be.eql('address1')
141+
server.services.pubsub.publish.calledWith('project.draft-created').should.be.true
140142
done()
141143
})
142144
})

src/routes/projects/delete.spec.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,20 @@ describe('Project delete test', () => {
9393
.expect(403, done)
9494
})
9595

96-
it('should return 204 if attachment was successfully removed', done => {
96+
it('should return 204 if project was successfully removed', done => {
9797
request(server)
9898
.delete('/v4/projects/' + project1.id)
9999
.set({
100100
'Authorization': 'Bearer ' + testUtil.jwts.member
101101
})
102-
.expect(204, done())
102+
.expect(204)
103+
.end(function(err, resp) {
104+
if (err) {
105+
return done(err)
106+
}
107+
server.services.pubsub.publish.calledWith('project.deleted').should.be.true
108+
done()
109+
})
103110
})
104111
})
105112
})

src/routes/projects/update.spec.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ describe('Project', () => {
161161
result.success.should.be.true
162162
result.status.should.equal(200)
163163
result.content.status.should.equal('active')
164+
server.services.pubsub.publish.calledWith('project.updated').should.be.true
164165
done()
165166
})
166167
})
@@ -181,6 +182,7 @@ describe('Project', () => {
181182
resJson.name.should.equal('updatedProject name')
182183
resJson.updatedAt.should.not.equal("2016-06-30 00:33:07+00")
183184
resJson.updatedBy.should.equal(40051332)
185+
server.services.pubsub.publish.calledWith('project.updated').should.be.true
184186
done()
185187
})
186188
})
@@ -251,6 +253,7 @@ describe('Project', () => {
251253
resJson.updatedAt.should.not.equal("2016-06-30 00:33:07+00")
252254
resJson.updatedBy.should.equal(40051332)
253255
postSpy.should.have.been.calledOnce
256+
server.services.pubsub.publish.calledWith('project.updated').should.be.true
254257
done()
255258
})
256259
})
@@ -274,6 +277,7 @@ describe('Project', () => {
274277
should.exist(resJson)
275278
resJson.billingAccountId.should.equal(1)
276279
resJson.billingAccountId.should.equal(1)
280+
server.services.pubsub.publish.calledWith('project.updated').should.be.true
277281
done()
278282
})
279283
})
@@ -298,6 +302,7 @@ describe('Project', () => {
298302
resJson.billingAccountId.should.equal(1)
299303
resJson.updatedAt.should.not.equal("2016-06-30 00:33:07+00")
300304
resJson.updatedBy.should.equal(40051333)
305+
server.services.pubsub.publish.calledWith('project.updated').should.be.true
301306
done()
302307
})
303308
})
@@ -342,6 +347,7 @@ describe('Project', () => {
342347
resJson = res.body.result.content
343348
should.exist(resJson)
344349
should.not.exist(resJson.bookmarks);
350+
server.services.pubsub.publish.calledWith('project.updated').should.be.true
345351
done()
346352
})
347353

src/tests/serviceMocks.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ module.exports = (app) => {
1313
index: () => {}
1414
}
1515
})
16-
sinon.stub(app.services.pubsub, 'publish', ()=>{ return Promise.resolve(true) })
17-
sinon.stub(app.services.es, 'index', ()=>{ return Promise.resolve(true) })
16+
sinon.stub(app.services.pubsub, 'publish', ()=> Promise.resolve(true) )
17+
sinon.stub(app.services.es, 'index', ()=> Promise.resolve(true) )
1818
}

0 commit comments

Comments
 (0)