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