zuora to eloqua | | zuora export catalog | Search

This code provides a set of functions to interact with the Zuora API, enabling users to initiate, track, and retrieve bulk data exports.

Run example

npm run import -- "zuora export service"

zuora export service

var importer = require('../Core');
var xlsx = require('xlsx');
var request = importer.import("request polyfill");

function getAuthHeaders(zuoraConfig) {
    if (typeof zuoraConfig === 'undefined'
        || zuoraConfig === null
        || typeof zuoraConfig.rest_api_user === 'undefined'
        || typeof zuoraConfig.rest_api_password === 'undefined'
        || typeof zuoraConfig.rest_api_url === 'undefined') {
        return Promise.resolve([]).then(() => {
            throw new Error('Please supply valid zuora configuration.');
        });
    }
    return {
        'Content-Type': 'application/json',
        'apiAccessKeyId': zuoraConfig.rest_api_user,
        'apiSecretAccessKey': zuoraConfig.rest_api_password,
        'Accept': 'application/json'
    };
}

function createBulkExportJob(query, zuoraConfig) {
    return request.request({
        followAllRedirects: true,
        uri: zuoraConfig.rest_api_url + '/object/export',
        json: query,
        method: 'POST',
        headers: getAuthHeaders(zuoraConfig)
    }).then(r => r.body.Id)
}

function getBulkExportJobStatus(exportId, zuoraConfig) {
    console.log('waiting...');
    return request.request({
        followAllRedirects: true,
        uri: zuoraConfig.rest_api_url + '/object/export/' + exportId,
        method: 'GET',
        headers: getAuthHeaders(zuoraConfig)
    }).then(r => {
        if (r.body.Status === 'Completed') {
            return r.body.FileId;
        } else if (r.body.Status === 'Processing' || r.body.Status === 'Pending') {
            return new Promise(resolve => setTimeout(resolve, 500))
                .then(() => getBulkExportJobStatus(exportId, zuoraConfig));
        } else {
            throw new Error('Export status error ' + r.statusCode + ' ' + r.body.Status);
        }
    });
}

function getBulkExportFile(fileId, zuoraConfig) {
    return request.request({
        followAllRedirects: true,
        uri: zuoraConfig.rest_api_url + '/files/' + fileId,
        method: 'GET',
        headers: getAuthHeaders(zuoraConfig)
    }).then(r => r.body)
}

function csvToJson(csv) {
    const workbook = xlsx.read(new Buffer(csv), {type:"buffer"});
    return xlsx.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]);
}

module.exports = {
    csvToJson,
    createBulkExportJob,
    getBulkExportFile,
    getBulkExportJobStatus,
    getAuthHeaders
}

What the code could have been:

const core = require('../Core');
const xlsx = require('xlsx');
const { promisify } = require('util');
const request = promisify(core.import('request polyfill'));

// Get Zuora API auth headers
async function getAuthHeaders(zuoraConfig) {
    if (!zuoraConfig || 
       !zuoraConfig.rest_api_user || 
       !zuoraConfig.rest_api_password || 
       !zuoraConfig.rest_api_url) {
        throw new Error('Please supply valid Zuora configuration.');
    }
    return {
        'Content-Type': 'application/json',
        'apiAccessKeyId': zuoraConfig.rest_api_user,
        'apiSecretAccessKey': zuoraConfig.rest_api_password,
        'Accept': 'application/json'
    };
}

// Create bulk export job in Zuora
async function createBulkExportJob(query, zuoraConfig) {
    try {
        const headers = await getAuthHeaders(zuoraConfig);
        const response = await request({
            followAllRedirects: true,
            uri: zuoraConfig.rest_api_url + '/object/export',
            json: query,
            method: 'POST',
            headers
        });
        return response.body.Id;
    } catch (error) {
        console.error('Error creating bulk export job:', error);
        throw error;
    }
}

// Get bulk export job status in Zuora
async function getBulkExportJobStatus(exportId, zuoraConfig, retryDelay = 500) {
    console.log('Waiting for export job to complete...');
    const maxAttempts = 120; // 2 minutes
    let attempts = 0;
    while (attempts < maxAttempts) {
        try {
            const headers = await getAuthHeaders(zuoraConfig);
            const response = await request({
                followAllRedirects: true,
                uri: zuoraConfig.rest_api_url + '/object/export/' + exportId,
                method: 'GET',
                headers
            });
            if (response.body.Status === 'Completed') {
                return response.body.FileId;
            } else if (response.body.Status === 'Processing' || response.body.Status === 'Pending') {
                await new Promise(resolve => setTimeout(resolve, retryDelay));
                attempts++;
            } else {
                throw new Error(`Export status error ${response.statusCode} ${response.body.Status}`);
            }
        } catch (error) {
            console.error('Error getting bulk export job status:', error);
            throw error;
        }
    }
    throw new Error(`Maximum attempts reached. Export job status: ${exportId}`);
}

// Get bulk export file from Zuora
async function getBulkExportFile(fileId, zuoraConfig) {
    try {
        const headers = await getAuthHeaders(zuoraConfig);
        const response = await request({
            followAllRedirects: true,
            uri: zuoraConfig.rest_api_url + '/files/' + fileId,
            method: 'GET',
            headers
        });
        return response.body;
    } catch (error) {
        console.error('Error getting bulk export file:', error);
        throw error;
    }
}

// Convert CSV to JSON
async function csvToJson(csv) {
    if (!csv) {
        return [];
    }
    const workbook = xlsx.read(new Buffer(csv), { type: "buffer" });
    return xlsx.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[0]]);
}

module.exports = {
    csvToJson,
    createBulkExportJob,
    getBulkExportFile,
    getBulkExportJobStatus,
    getAuthHeaders
};

This code defines functions to interact with the Zuora API for bulk data exports.

Here's a breakdown:

  1. Dependencies:

  2. getAuthHeaders Function:

  3. createBulkExportJob Function:

  4. getBulkExportJobStatus Function:

  5. getBulkExportFile Function:

In essence, this code provides a set of functions to initiate, monitor, and retrieve bulk data exports from the Zuora API.