in lambdas/src/MembershipSub-PromoCode-View-Dynamo-to-Salesforce.js [76:222]
function makeAPICalls(csvData) {
return (loginData) => {
const accessToken = loginData.accessToken;
const instanceUrl = loginData.instanceUrl;
let interval = null;
const getOptions = () => {
return {
hostname: instanceUrl,
port: 443,
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
}
};
}
function createAJob() {
return new Promise((fulfilled, rejected) => {
const options = getOptions();
options.path = '/services/data/v42.0/jobs/ingest';
options.method = 'POST';
makeSalesforceAPIRequest(
options,
JSON.stringify({
"externalIdFieldName": "Name",
"object": "Promotion_Code__c",
"operation": "upsert"
}),
(res, body) => {
if (res.statusCode === 200) {
const data = JSON.parse(body);
fulfilled(data.id);
} else {
rejected(`Error: createAJob - ${res.statusCode} - ${body}`);
}
},
rejected
);
});
}
function uploadJobData(jobId) {
return new Promise((fulfilled, rejected) => {
const options = getOptions();
options.path = `/services/data/v42.0/jobs/ingest/${jobId}/batches`;
options.headers["Content-Type"] = 'text/csv';
options.method = 'PUT';
makeSalesforceAPIRequest(
options,
csvData,
(res, body) => {
if (res.statusCode === 201) {
fulfilled(jobId);
} else {
rejected(`Error: uploadJobData - ${res.statusCode} - ${body}`);
}
},
rejected
);
});
}
function closeAJob(jobId) {
return new Promise((fulfilled, rejected) => {
const options = getOptions();
options.path = `/services/data/v42.0/jobs/ingest/${jobId}`;
options.method = 'PATCH';
makeSalesforceAPIRequest(
options,
JSON.stringify({ 'state': 'UploadComplete' }),
(res, body) => {
if (res.statusCode === 200) {
const data = JSON.parse(body);
if (data.state === 'UploadComplete') {
fulfilled(jobId);
} else {
rejected(`Error: closeAJob - ${res.statusCode} - ${body}`);
}
} else {
rejected(`Error: closeAJob - ${res.statusCode} - ${body}`);
}
},
rejected
);
});
}
function testJobHasCompleted(jobId, fulfilled, rejected) {
const options = getOptions();
options.path = `/services/data/v42.0/jobs/ingest/${jobId}`;
options.method = 'GET';
return () => makeSalesforceAPIRequest(
options,
'',
(res, body) => {
if (res.statusCode === 200) {
const data = JSON.parse(body);
if (data.state === 'JobComplete') {
clearInterval(interval);
fulfilled(jobId);
} else if (data.state === 'Failed') {
clearInterval(interval);
rejected(data.errorMessage);
}
} else {
clearInterval(interval);
rejected(`Error: testJobHasCompleted - ${res.statusCode} - ${body}`);
}
},
(error) => {
clearInterval(interval);
rejected(error);
}
);
}
function waitForJobToComplete(jobId) {
return new Promise((fulfilled, rejected) => {
interval = setInterval(testJobHasCompleted(jobId, fulfilled, rejected), 250);
});
}
function deleteAJob(jobId) {
return new Promise((fulfilled, rejected) => {
const options = getOptions();
options.path = `/services/data/v42.0/jobs/ingest/${jobId}`;
options.method = 'DELETE';
makeSalesforceAPIRequest(
options,
'',
(res, body) => {
if (res.statusCode === 204) {
fulfilled(`Successfully updated Salesforce Promotion Codes`);
} else {
rejected(`Error: deleteAJob - ${res.statusCode} - ${body}`);
}
},
rejected
);
});
}
return createAJob()
.then(uploadJobData)
.then(closeAJob)
.then(waitForJobToComplete)
.then(deleteAJob)
};
}