This code provides a set of functions to interact with the Zuora API, enabling users to initiate, track, and retrieve bulk data exports.
npm run import -- "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
}
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:
Dependencies:
importer
: A custom module for importing other modules (likely for handling requests).xlsx
: A library for working with Excel files (likely used for processing the exported data).request
: A library for making HTTP requests (imported via importer
).getAuthHeaders
Function:
zuoraConfig
object containing API credentials.createBulkExportJob
Function:
query
object defining the data to export and zuoraConfig
.getBulkExportJobStatus
Function:
exportId
and zuoraConfig
.FileId
for downloading the export file.getBulkExportFile
Function:
fileId
and zuoraConfig
.FileId
.In essence, this code provides a set of functions to initiate, monitor, and retrieve bulk data exports from the Zuora API.