UNPKG

mstr-report-data-service

Version:

A Node function for calling Microstrategy's reportDataService task and returning the payload as JSON.

61 lines (51 loc) 2.11 kB
import { parseString } from 'xml2js'; import { camelCase } from 'lodash'; import parseValue from './parseValue' // custom parsing function export default function parseMstrResults(xmlBody) { return new Promise((resolve, reject) => { parseString(xmlBody, {}, (err, json) => { if (err) return reject(err) // parent reportData object let reportData = json.taskResponse.report_data_list[0].report_data[0] // basic meta let reportName = reportData.$.name // report objects, like 'day' let reportObjects = reportData.objects[0].attribute.map(attr => attr.$) // report metrics, like 'activations' let reportMetrics = reportData.objects[0].metric.map(metric => metric.$) // report row headers, report layout let reportRowHeaders = reportData.raw_data[0].headers[0].oi.map(header => { let id = header.$.rfd // concat objects/metrics as headers let name = [...reportObjects, ...reportMetrics].filter(value => value.rfd == id)[0].name // return header name and rfd id # return { rfd: id, name } }) // report row data, with headers as object keys/properties // json array let reportRowValues = reportData.raw_data[0].rows[0].r.map((row) => { // declare object to return let returnObject = {} // iterate over value array, and assign rowheader as key/property row.v.forEach((v, index) => { let value = v._ let key = camelCase(reportRowHeaders[index].name) returnObject[key] = parseValue(value) }) return returnObject }) resolve({ name: reportName, data: reportRowValues }) }) }) }