Skip to content

Instantly share code, notes, and snippets.

@aloncarmel
Created April 20, 2016 13:11
Show Gist options
  • Save aloncarmel/86b512315387b37dd0869c24f30bc2d3 to your computer and use it in GitHub Desktop.
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.
{
"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": ""
}
module.exports = {
"traits": {
"email": "you@gmail.com",
"name": "aloncarmel",
"plan": "free",
"createdAt": 1427391725,
"last_seen_at": "1461142607"
},
"type": "identify",
"userId": "xxxx",
};
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