zuora to eloqua | test zuora renewals query | test eloqua import service | Search

This code provides functions for authenticating with Eloqua using OAuth and making API requests, including a function specifically for checking the status of bulk imports.

Run example

npm run import -- "eloqua import service"

eloqua import service

var importer = require('../Core');
var request = importer.import("http request polyfill");
var {
    bulkImportTemplate,
    temporaryImportTemplate
} = importer.import("eloqua create template");

function eloquaOauth(eloquaConfig) {
    if (typeof eloquaConfig === 'undefined'
        || eloquaConfig === null
        || typeof eloquaConfig.rest_api_company === 'undefined'
        || typeof eloquaConfig.rest_api_user === 'undefined'
        || typeof eloquaConfig.rest_api_url === 'undefined'
        || typeof eloquaConfig.rest_api_password === 'undefined'
        || typeof eloquaConfig.rest_client_id === 'undefined'
        || typeof eloquaConfig.rest_secret === 'undefined') {
        return Promise.resolve([]).then(() => {
            throw new Error('Please supply valid eloqua configuration.');
        });
    }
    var authBody = {
        "grant_type": "password",
        "scope": "full",
        "username": eloquaConfig.rest_api_company + '\\' + eloquaConfig.rest_api_user,
        "password": eloquaConfig.rest_api_password
    };
    return request.request({
        followAllRedirects: true,
        uri: eloquaConfig.token_uri,
        method: 'POST',
        json: authBody,
        headers: {
            'Authorization': "Basic " + new Buffer(eloquaConfig.rest_client_id + ":" + eloquaConfig.rest_secret).toString("base64"),
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        }
    }).then(res => {
        res.body.expires = (new Date()).getTime() + parseFloat(res.body.expires_in) * 1000;
        return res.body;
    });
}

function eloquaRequestHeaders(eloquaToken) {
    return {
        'Authorization': "Bearer " + eloquaToken.access_token,
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    };
}

function eloquaBulkImportStatus(syncUri, eloquaToken, eloquaConfig) {
    console.log(syncUri);
    return request.request({
        followAllRedirects: true,
        uri: eloquaConfig.rest_api_url + '/bulk/2.0' + syncUri,
        method: 'GET',
        headers: eloquaRequestHeaders(eloquaToken)
    }).then(res => {
        if (res.body.status === 'success' || res.body.status === 'warning') {
            return true;
        } else if (res.body.status === 'active' || res.body.status === 'pending') {
            return new Promise(resolve => setTimeout(resolve, 500))
                .then(() => eloquaBulkImportStatus(syncUri, eloquaToken, eloquaConfig));
        } else {
            throw new Error('Sync status error ' + res.statusCode + ' ' + JSON.stringify(res.body));
        }
    });
}

function completeBulkImportSync(importUri, eloquaToken, eloquaConfig) {
    return request.request({
        followAllRedirects: true,
        uri: eloquaConfig.rest_api_url + '/bulk/2.0/syncs',
        method: 'POST',
        json: {
            syncedInstanceUri: importUri
        },
        headers: eloquaRequestHeaders(eloquaToken)
    }).then(res => {
        const syncUri = res.body.uri;
        return eloquaBulkImportStatus(syncUri, eloquaToken, eloquaConfig);
    });
}

function startBulkImportData(json, importUri, eloquaToken, eloquaConfig) {
    if(typeof importUri !== 'string') {
        throw new Error('something is seriously wrong with this import');
    }
    return request.request({
        followAllRedirects: true,
        uri: eloquaConfig.rest_api_url + '/bulk/2.0' + importUri + '/data',
        method: 'POST',
        json: json,
        headers: eloquaRequestHeaders(eloquaToken)
    });
}

// https://docs.oracle.com/cloud/latest/marketingcs_gs/OMCAB/Developers/BulkAPI/Endpoints/Custom%20objects/Imports/post-customObjects-imports.htm
function createImportDefinition(customDataObjectId, eloquaToken, eloquaConfig) {
    return request.request({
        followAllRedirects: true,
        uri: eloquaConfig.rest_api_url + '/bulk/2.0/customobjects/' + customDataObjectId + '/imports',
        method: 'POST',
        json: bulkImportTemplate(customDataObjectId),
        headers: eloquaRequestHeaders(eloquaToken)
    }).then(res => {
        return res.body.uri;
    });
}

function createInstanceDefinition(instanceId, executionId, eloquaToken, eloquaConfig) {
    return request.request({
        followAllRedirects: true,
        uri: eloquaConfig.rest_api_url + '/bulk/2.0/contacts/imports',
        method: 'POST',
        json: temporaryImportTemplate(instanceId, executionId),
        headers: eloquaRequestHeaders(eloquaToken)
    }).then(res => {
        return res.body.uri;
    });
}

module.exports = {
    eloquaOauth,
    createImportDefinition,
    startBulkImportData,
    completeBulkImportSync,
    eloquaBulkImportStatus,
    createInstanceDefinition,
    eloquaRequestHeaders
}

What the code could have been:

// Import dependencies
const { importCore } = require('../Core');

// Import http request polyfill and Eloqua templates
const { createHttpRequest, bulkImportTemplate, temporaryImportTemplate } = importCore();

// Eloqua OAuth function to obtain access token
/**
 * Obtain an Eloqua access token using the provided configuration.
 *
 * @param {Object} eloquaConfig - Eloqua configuration object.
 * @returns {Promise<Object>} - Promise containing the access token.
 */
function eloquaOauth(eloquaConfig) {
    // Check if configuration is valid
    if (!eloquaConfig || 
       !eloquaConfig.rest_api_company || 
       !eloquaConfig.rest_api_user || 
       !eloquaConfig.rest_api_url || 
       !eloquaConfig.rest_api_password || 
       !eloquaConfig.rest_client_id || 
       !eloquaConfig.rest_secret) {
        return Promise.reject(new Error('Invalid Eloqua configuration'));
    }

    // Create authentication body
    const authBody = {
        grant_type: 'password',
        scope: 'full',
        username: `${eloquaConfig.rest_api_company}\\${eloquaConfig.rest_api_user}`,
        password: eloquaConfig.rest_api_password
    };

    // Create HTTP request options
    const options = {
        uri: eloquaConfig.token_uri,
        method: 'POST',
        json: authBody,
        headers: {
            'Authorization': `Basic ${ Buffer.from(`${eloquaConfig.rest_client_id}:${eloquaConfig.rest_secret}`).toString('base64') }`,
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        }
    };

    // Send HTTP request to obtain access token
    return createHttpRequest(options).then((res) => {
        // Update expiration time
        res.body.expires = (new Date()).getTime() + parseFloat(res.body.expires_in) * 1000;

        // Return access token
        return res.body;
    });
}

// Eloqua request headers function
/**
 * Create Eloqua request headers using the provided access token.
 *
 * @param {Object} eloquaToken - Eloqua access token object.
 * @returns {Object} - Eloqua request headers object.
 */
function eloquaRequestHeaders(eloquaToken) {
    // Create headers object
    return {
        Authorization: `Bearer ${eloquaToken.access_token}`,
        'Content-Type': 'application/json',
        'Accept': 'application/json'
    };
}

// Eloqua bulk import status function
/**
 * Check the status of an Eloqua bulk import.
 *
 * @param {string} syncUri - Eloqua sync URI.
 * @param {Object} eloquaToken - Eloqua access token object.
 * @param {Object} eloquaConfig - Eloqua configuration object.
 * @returns {Promise<boolean|Error>} - Promise containing the status or an error.
 */
function eloquaBulkImportStatus(syncUri, eloquaToken, eloquaConfig) {
    // Create HTTP request options
    const options = {
        uri: `${eloquaConfig.rest_api_url}/bulk/2.0${syncUri}`,
        method: 'GET',
        headers: eloquaRequestHeaders(eloquaToken)
    };

    // Send HTTP request to check status
    return createHttpRequest(options).then((res) => {
        // Check status
        if (res.body.status ==='success' || res.body.status === 'warning') {
            return true;
        } else if (res.body.status === 'active' || res.body.status === 'pending') {
            // Wait for 500ms and retry
            return new Promise((resolve) => setTimeout(resolve, 500)).then(() => {
                return eloquaBulkImportStatus(syncUri, eloquaToken, eloquaConfig);
            });
        } else {
            // Throw error
            throw new Error(`Sync status error ${res.statusCode} ${JSON.stringify(res.body)}`);
        }
    });
}

// Complete bulk import sync function
/**
 * Complete an Eloqua bulk import sync.
 *
 * @param {string} importUri - Eloqua import URI.
 * @param {Object} eloquaToken - Eloqua access token object.
 * @param {Object} eloquaConfig - Eloqua configuration object.
 * @returns {Promise<Object>} - Promise containing the sync URI.
 */
function completeBulkImportSync(importUri, eloquaToken, eloquaConfig) {
    // Create HTTP request options
    const options = {
        uri: `${eloquaConfig.rest_api_url}/bulk/2.0/syncs`,
        method: 'POST',
        json: { syncedInstanceUri: importUri },
        headers: eloquaRequestHeaders(eloquaToken)
    };

    // Send HTTP request to complete sync
    return createHttpRequest(options).then((res) => {
        // Get sync URI
        const syncUri = res.body.uri;

        // Return sync URI
        return syncUri;
    });
}

// Start bulk import data function
/**
 * Start an Eloqua bulk import data.
 *
 * @param {Object} json - Bulk import JSON data.
 * @param {string} importUri - Eloqua import URI.
 * @param {Object} eloquaToken - Eloqua access token object.
 * @param {Object} eloquaConfig - Eloqua configuration object.
 * @returns {Promise<Object>} - Promise containing the HTTP response.
 */
function startBulkImportData(json, importUri, eloquaToken, eloquaConfig) {
    // Check import URI
    if (typeof importUri!=='string') {
        throw new Error('Invalid import URI');
    }

    // Create HTTP request options
    const options = {
        uri: `${eloquaConfig.rest_api_url}/bulk/2.0${importUri}/data`,
        method: 'POST',
        json,
        headers: eloquaRequestHeaders(eloquaToken)
    };

    // Send HTTP request to start data import
    return createHttpRequest(options);
}

// Create import definition function
/**
 * Create an Eloqua import definition.
 *
 * @param {string} customDataObjectId - Eloqua custom data object ID.
 * @param {Object} eloquaToken - Eloqua access token object.
 * @param {Object} eloquaConfig - Eloqua configuration object.
 * @returns {Promise<string>} - Promise containing the import URI.
 */
function createImportDefinition(customDataObjectId, eloquaToken, eloquaConfig) {
    // Create import definition using template
    const importDefinition = bulkImportTemplate(customDataObjectId);

    // Create HTTP request options
    const options = {
        uri: `${eloquaConfig.rest_api_url}/bulk/2.0/customobjects/${customDataObjectId}/imports`,
        method: 'POST',
        json: importDefinition,
        headers: eloquaRequestHeaders(eloquaToken)
    };

    // Send HTTP request to create import definition
    return createHttpRequest(options).then((res) => {
        // Get import URI
        return res.body.uri;
    });
}

// Create instance definition function
/**
 * Create an Eloqua instance definition.
 *
 * @param {string} instanceId - Eloqua instance ID.
 * @param {string} executionId - Eloqua execution ID.
 * @param {Object} eloquaToken - Eloqua access token object.
 * @param {Object} eloquaConfig - Eloqua configuration object.
 * @returns {Promise<string>} - Promise containing the instance URI.
 */
function createInstanceDefinition(instanceId, executionId, eloquaToken, eloquaConfig) {
    // Create instance definition using template
    const instanceDefinition = temporaryImportTemplate(instanceId, executionId);

    // Create HTTP request options
    const options = {
        uri: `${eloquaConfig.rest_api_url}/bulk/2.0/contacts/imports`,
        method: 'POST',
        json: instanceDefinition,
        headers: eloquaRequestHeaders(eloquaToken)
    };

    // Send HTTP request to create instance definition
    return createHttpRequest(options).then((res) => {
        // Get instance URI
        return res.body.uri;
    });
}

// Export functions
module.exports = {
    eloquaOauth,
    createImportDefinition,
    startBulkImportData,
    completeBulkImportSync,
    eloquaBulkImportStatus,
    createInstanceDefinition,
    eloquaRequestHeaders
};

This code defines functions for interacting with the Eloqua marketing automation platform using OAuth authentication and making API requests.

Here's a breakdown:

  1. Dependencies:

  2. eloquaOauth Function:

  3. eloquaRequestHeaders Function:

  4. eloquaBulkImportStatus Function: