function makeAPICalls()

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)
    };
}