UNPKG

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