Created
April 20, 2016 13:11
-
-
Save aloncarmel/86b512315387b37dd0869c24f30bc2d3 to your computer and use it in GitHub Desktop.
An Amazon lambda nodejs code that runs and waits for API calls coming in from a segment webhook configured. This lets you sync segment identify calls to salesforce. Its ready for a call from salesforce to update segment.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"name": "segmenttosalesforce", | |
"private": true, | |
"version": "0.0.1", | |
"description": " sync data across services", | |
"keywords": [], | |
"dependencies": { | |
"aws-sdk": "^2.0.17", | |
"request": "^2.44.0", | |
"bcrypt": "^0.8.0", | |
"crypto": "0.0.3", | |
"async": "^0.9.0", | |
"underscore": "1.x", | |
"segment.js": "*", | |
"jsforce": "*" | |
}, | |
"author": "aloncarmel", | |
"license": "" | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module.exports = { | |
"traits": { | |
"email": "[email protected]", | |
"name": "aloncarmel", | |
"plan": "free", | |
"createdAt": 1427391725, | |
"last_seen_at": "1461142607" | |
}, | |
"type": "identify", | |
"userId": "xxxx", | |
}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var Segment = require('segment.js'); | |
var jsforce = require('jsforce'); | |
var conn = new jsforce.Connection(); | |
// the 'handler' that lambda calls to execute our code | |
var analytics = new Segment({ | |
writeKey: "XXXX", | |
flushWait: 5000, | |
flushMaxWait: 5000 | |
}); | |
function handleIdentify(userobj,context) { | |
analytics.identify(userobj,function() { | |
console.log('Done segment') | |
context.done(null, 'Done'); | |
//cb(null,'done'); | |
}); | |
} | |
function handleSalesForce(userobj,context) { | |
var conn = new jsforce.Connection({ | |
// you can change loginUrl to connect to sandbox or prerelease env. | |
loginUrl : 'https://XXX.salesforce.com' | |
}); | |
var salesforceauth = { | |
accesstoken:"XXXX", | |
instanceUrl: "https://XXX.salesforce.com", | |
userId: "XXX", | |
ordId: "XXX" | |
}; | |
conn.login('YOURSALESFORCEEMAIL', 'PASSWORD+SECURITYTOKEN', function(err, userInfo) { | |
if (err) { return console.error(err); } | |
var contactobj = { | |
Name: userobj.traits.name, | |
UserId__c: userobj.userId, | |
AccountNumber: userobj.userId, | |
Email__c: userobj.traits.email, | |
Plan__c: userobj.traits.plan, | |
Signup__c: userobj.traits.createdAt | |
} | |
conn.query('SELECT Id, Name FROM Account WHERE UserId__c = \''+contactobj.UserId__c+'\'', function(err, res) { | |
if (err) { return console.error(err); } | |
console.log(res); | |
if(res.records.length > 0) { | |
//Account found, update it | |
console.log('Found account'); | |
contactobj.Id = res.records[0].Id; | |
conn.sobject("Account").update(contactobj, function(err, ret) { | |
if (err || !ret.success) { return console.error(err, ret); } | |
console.log("updated record id : " + ret.id); | |
console.log('Done salesforce') | |
context.done(null, 'Done'); | |
}); | |
} else { | |
//Account not found, create new | |
console.log('No Account'); | |
conn.sobject("Account").create(contactobj, function(err, ret) { | |
if (err || !ret.success) { return console.error(err, ret); } | |
console.log("Created record id : " + ret.id); | |
console.log('Done salesforce') | |
context.done(null, 'Done'); | |
}); | |
} | |
}); | |
}); | |
} | |
exports.handler = function(event, context,callback) { | |
var userobj = { | |
userId: event.userId, | |
traits: { | |
email: event.traits.email, | |
name: event.traits.name, | |
plan: event.traits.plan, | |
createdAt: event.traits.createdAt, | |
last_seen_at: Math.floor(new Date() / 1000) | |
}, | |
} | |
switch(event.type) { | |
case "identify": | |
handleSalesForce(userobj,context); | |
break; | |
case "salesforce": | |
handleIdentify(userobj,context); | |
default: | |
break; | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment