domo-ds
Version:
Domo dataset reviewer allowing you to see upstream and downstream dependencies for all datasets and dataflows in an instance of Domo.
290 lines (251 loc) • 7.72 kB
JavaScript
var util = require('util');
var EventEmitter = require('events').EventEmitter;
var Cards = function(settings){
var c = this;
settings = settings || {};
c.sid = settings.sid || null;
c.token = settings.token || null;
c.host = settings.host || null;
c.method = 'GET';
c.data = {};
c.kpis = [];
c.urnList = [];
c.limit = 400;
c.page = 0;
c.timeout = null;
}
Cards.prototype.getFullList = function(settings){
var c = this;
settings = settings || {};
c.sid = settings.sid || c.sid;
c.token = settings.token || c.token;
c.host = settings.host || c.host;
var headers = {};
if(c.token !== '' & c.token){
headers['X-DOMO-Developer-Token'] = c.token;
}else{
headers['X-DOMO-Authentication'] = c.sid;
}
if(!c.host || (!c.sid && !c.token)){
c.emit('error', 'c1', `Unable to get cards due to missing sid(${c.sid}) or host(${c.host})`);
}
var get = require('https').request({
hostname: c.host
,path: '/access/kpilist'
,method: c.method
,headers
}, (res) => {
res.setEncoding('utf8');
var response = '';
res.on('data', (chunk) =>{
response += chunk;
});
res.on('end',() =>{
if(res.statusCode != 200){
for(x in headers){
c.emit('error', 'c2', `Unable to get cards! Status ${res.statusCode}: ${res.statusMessage} ... with headers: ${x} = "${headers[x]}"`)
}
}else{
let tracker = {};
c.data = JSON.parse(response);
for(var i in c.data){
let kpi = c.data[i];
kpi.kpiMetaData.formulas = kpi.kpiMetaData.formulas || `{"formulas":{}}`;
// for(let x in kpi.kpiMetaData){
// if(tracker[x]){
// tracker[x]++;
// }else{
// tracker[x] = 1;
// }
// }
c.data[i] = {
creatorUserId: kpi.creatorUserId
,dataUpdated: kpi.dataUpdated
,kpiUpdated: kpi.kpiUpdated
,description: kpi.description
,kpiId: kpi.kpiId
,kpiTitle: kpi.kpiTitle
,calendar: kpi.kpiMetaData.calendar
,chartType: kpi.kpiMetaData.chartType
,dataType: kpi.kpiMetaData.dataType
,drills: kpi.kpiMetaData.hasDrillChildren
,beastmodes: Object.keys(JSON.parse(kpi.kpiMetaData.formulas).formulas).length || 0
}
c.urnList.push(i+'');
c.kpis.push(c.data[i]);
};
// console.log('tracker', tracker);
c.throttleCards();
}
});
});
get.end();
// https://videotraining.domo.com/access/kpilist
// use the key, or kpiId (match) for each object to create a list to submit ot the urns path below
};
Cards.prototype.throttleCards = function(){
var c = this;
var start = c.page*c.limit;
var end = start+c.limit;
var dots = '. ';
if(c.page > 4){
// process.exit();
}
var urns = c.urnList.slice(start,end).join();
c.page++;
if(urns.length > 0){
if(c.timeout){clearInterval(c.timeout);};
c.emit('progress', `${dots}Requesting ${start}-${end} of ${c.kpis.length}`);
c.getURNDetails({urns});
c.timeout = setInterval(function(){
switch(dots){
case '. ':
dots = '.. ';
break;
case '.. ':
dots = '...';
break;
case '...':
dots = ' ..';
break;
case ' ..':
dots = ' .';
break;
case ' .':
dots = ' ';
break;
case ' ':
dots = '. ';
}
c.emit('progress', `${dots}Requesting ${start}-${end} of ${c.kpis.length}`);
},200);
}else{
if(c.timeout){clearInterval(c.timeout);};
let fields = ['calendar','chartType', 'creatorUserId', 'dataType', 'dataUpdated', 'dataset', 'description', 'kpiId', 'kpiTitle', 'pages', 'drills', 'beastmodes', 'views'];
let zeroFields = {'beastmodes': true, 'views': true}
c.kpis = c.kpis.map(kpi => {
let tmp = [];
fields.forEach(field => {
if(kpi[field]){
tmp.push(kpi[field]);
}else if(zeroFields[field]){
tmp.push(0);
}else{
tmp.push('');
}
})
return tmp;
});
c.kpis = {
fields: fields
,rows: c.kpis
}
c.emit('success');
};
};
Cards.prototype.getURNDetails = function(settings){
var c = this;
settings = settings || {};
c.sid = settings.sid || c.sid;
c.token = settings.token || c.token;
c.host = settings.host || c.host;
var urns = settings.urns || '';
if(!c.host || (!c.sid && !c.token)){
c.emit('error', 'c3', `Unable to get urns due to missing sid(${c.sid}) or host(${c.host})`);
}
var headers = {};
if(c.token !== '' && c.token){
headers['X-DOMO-Developer-Token'] = c.token;
}else{
headers['X-DOMO-Authentication'] = c.sid;
}
// available parts: owner,properties,problems,metadata,metadataOverrides,library,subscriptions,domoapp,formulas,masonData,adminAllPages
var parts = 'subscriptions,adminAllPages'; //,formulas';
var viewsGotten = false;
var detailsGotten = false;
var throttleAgain = function(){
if(viewsGotten && detailsGotten){
c.throttleCards();
}
}
var get = require('https').request({
hostname: c.host
,path: `/api/content/v1/cards?urns=${urns}&parts=${parts}`
,method: c.method
,headers
}, (res) => {
res.setEncoding('utf8');
var response = '';
res.on('data', (chunk) =>{
response += chunk+'';
chunk = '';
});
res.on('end',() =>{
if(res.statusCode != 200){
c.emit('error', 'c4', `Unable to get cards! Status ${res.statusCode}: ${res.statusMessage}`)
}else{
var data = JSON.parse(response);
// console.log('data length', data.length);
var tracker = {};
data.forEach(function(me,idx,arr){
for(let x in me){
if(tracker[x]){
tracker[x]++;
}else{
tracker[x] = 1;
}
}
// if(me.formulas.formulas){
// c.data[me.urn+''].formulas = JSON.parse(JSON.stringify(me.formulas.formulas));
// };
if(me.adminAllPages){
c.data[me.urn+''].pages = JSON.parse(JSON.stringify(me.adminAllPages.map(page=>{
return page.pageId;
})));
}
if(me.subscriptions){
c.data[me.urn+''].dataset = me.subscriptions.map(card => {
return card.dataSourceId;
})[0]+'';
};
});
detailsGotten = true;
throttleAgain();
};
});
});
get.end();
headers["content-type"] = 'application/json';
var getViews = require('https').request({
hostname: c.host
,path: `/api/content/v1/analytics/views/cards/counts`
,method: `PUT`
,headers
}, (res) => {
res.setEncoding('utf8');
var response = '';
res.on('data', (chunk) =>{
response += chunk+'';
chunk = '';
});
res.on('end',() =>{
if(res.statusCode != 200){
c.emit('error', 'c4', `Unable to get views for cards! Status ${res.statusCode}: ${res.statusMessage}`)
}else{
var data = JSON.parse(response);
// console.log('urn views length', data);
for(urn in data){
c.data[urn + ''].views = data[urn].totalViews || 0;
}
viewsGotten = true;
throttleAgain();
};
});
});
// var puturns = JSON.stringify({urns:urns.split(',')});
var puturns = `{"urns":[${urns}]}`;
getViews.write(puturns);
getViews.end();
}
util.inherits(Cards, EventEmitter);
module.exports = {new: function(settings){return new Cards(settings);}};