node-red-contrib-powerbi
Version:
A PowerBI API interaction node-red module which allows to interact with PowerBI service.
299 lines (256 loc) • 9.01 kB
JavaScript
var request = require('request');
module.exports = function(RED) {
function PowerBIReports(config) {
RED.nodes.createNode(this,config);
// Retrieve the connection node.
this.connection = RED.nodes.getNode(config.connection);
var node = this;
function IsInvalidParameter(p) {
return (p === undefined ||
p.id === undefined ||
p.id.length === 0);
}
node.on('input', function(msg) {
function ProcessResponse(error, response, body) {
if (response !== undefined) {
msg.status = response.statusCode;
msg.headers = response.headers;
}
msg.payload = body;
response !== undefined &&
response.statusCode !== undefined &&
response.statusCode === 200 ? node.send(msg) : node.send([null, msg]);
}
if (config.operation !== 'importreport' &&
config.operation !== 'getreports' &&
IsInvalidParameter(msg.report)) {
msg.payload = "Missing target report id";
node.send([null, msg]);
return;
}
switch (config.operation) {
case "clonereport":
if (IsInvalidParameter(msg.workspace) == false &&
msg.target.report !== undefined &&
msg.target.report.name !== undefined &&
msg.target.report.name.length > 0 &&
IsInvalidParameter(msg.target.report.model) == false &&
IsInvalidParameter(msg.target.workspace) == false) {
request({
json: true,
method:'POST',
url: 'https://api.powerbi.com/v1.0/myorg/groups/' + msg.workspace.id + '/reports/' + msg.report.id + '/Clone',
body: {
'name': msg.target.report.name,
'targetWorkspaceId' : msg.target.workspace.id,
'targetModelId': msg.target.report.model.id
},
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken
}}, ProcessResponse);
} else {
request({
json: true,
method:'POST',
url: 'https://api.powerbi.com/v1.0/myorg/reports/' + msg.report.id + '/Clone',
body: {
'name': msg.report.name,
'targetWorkspaceId' : msg.workspace.id,
'targetModelId': msg.report.model.id
},
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken
}}, ProcessResponse);
}
break;
case "deletereport":
if (IsInvalidParameter(msg.workspace) == false) {
request({
method:'DELETE',
url: 'https://api.powerbi.com/v1.0/myorg/groups/' + msg.workspace.id + '/reports/' + msg.report.id,
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken
}}, ProcessResponse);
} else {
request({
method:'DELETE',
url: 'https://api.powerbi.com/v1.0/myorg/reports/' + msg.report.id,
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken
}}, ProcessResponse);
}
break;
case "exportreport":
if (IsInvalidParameter(msg.workspace) == false) {
request({
method:'GET',
url: 'https://api.powerbi.com/v1.0/myorg/groups/' + msg.workspace.id + '/reports/' + msg.report.id + '/Export',
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken,
'Accept': 'multipart/form-data'
}}, ProcessResponse);
} else {
request({
method:'GET',
url: 'https://api.powerbi.com/v1.0/myorg/reports/' + msg.report.id + '/Export',
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken,
'Accept': 'multipart/form-data'
}}, ProcessResponse);
}
break;
case "importreport":
if (IsInvalidParameter(msg.workspace) == false) {
request({
json: true,
method:'POST',
url: 'https://api.powerbi.com/v1.0/myorg/groups/' + msg.workspace.id + '/imports',
body: msg.payload,
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken,
'Content-Type': 'multipart/form-data'
}}, ProcessResponse);
} else {
request({
json: true,
method:'POST',
url: 'https://api.powerbi.com/v1.0/myorg/imports',
body: msg.payload,
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken,
'Content-Type': 'multipart/form-data'
}}, ProcessResponse);
}
break;
case "getimportreport":
if (IsInvalidParameter(msg.imports))
{
msg.payload = 'Missing import information';
node.send([null, msg]);
return;
}
if (IsInvalidParameter(msg.workspace) == false) {
request({
method:'GET',
url: 'https://api.powerbi.com/v1.0/myorg/groups/' + msg.workspace.id + '/imports/' + msg.imports.id,
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken,
'Content-Type': 'application/json'
}}, ProcessResponse);
} else {
request({
method:'GET',
url: 'https://api.powerbi.com/v1.0/myorg/imports/' + msg.imports.id,
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken,
'Content-Type': 'applcation/json'
}}, ProcessResponse);
}
break;
case "getreports":
if (IsInvalidParameter(msg.workspace) == false) {
request({
method:'GET',
url: 'https://api.powerbi.com/v1.0/myorg/groups/' + msg.workspace.id + '/reports',
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken
}}, ProcessResponse);
} else {
request({
method:'GET',
url: 'https://api.powerbi.com/v1.0/myorg/reports',
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken
}}, ProcessResponse);
}
break;
case "getreport":
if (IsInvalidParameter(msg.workspace) == false) {
request({
method:'GET',
url: 'https://api.powerbi.com/v1.0/myorg/groups/' + msg.workspace.id + '/reports/' + msg.report.id,
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken
}}, ProcessResponse);
} else {
request({
method:'GET',
url: 'https://api.powerbi.com/v1.0/myorg/reports/' + msg.report.id,
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken
}}, ProcessResponse);
}
break;
case "rebindreport":
if (IsInvalidParameter(msg.report.dataset)) {
msg.payload = "Missing report dataset to rebind into.";
node.send([null, msg]);
return;
}
if (IsInvalidParameter(msg.workspace) == false) {
request({
json: true,
method:'POST',
url: 'https://api.powerbi.com/v1.0/myorg/groups/' + msg.workspace.id + '/reports/' + msg.report.id + '/Rebind',
body: {
"datasetId": msg.report.dataset.id
},
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken
}}, ProcessResponse);
} else {
request({
json: true,
method:'POST',
url: 'https://api.powerbi.com/v1.0/myorg/reports/' + msg.report.id + '/Rebind',
body: {
"datasetId": msg.report.dataset.id
},
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken
}}, ProcessResponse);
}
break;
case "updatereportcontent":
if (IsInvalidParameter(msg.source.report) ||
IsInvalidParameter(msg.source.workspace))
{
msg.payload = 'Missing source information';
node.send([null, msg]);
return;
}
if (IsInvalidParameter(msg.workspace) == false) {
request({
json: true,
method:'POST',
url: 'https://api.powerbi.com/v1.0/myorg/groups/' + msg.workspace.id + '/reports/' + msg.report.id + '/UpdateReportContent',
body: {
"sourceType": "ExistingReport",
"sourceReport": {
"sourceReportId": msg.source.report.id,
"sourceWorkspaceId": msg.source.workspace.id }
},
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken
}}, ProcessResponse);
} else {
request({
json: true,
method:'POST',
url: 'https://api.powerbi.com/v1.0/myorg/reports/' + msg.report.id + '/UpdateReportContent',
body: {
"sourceType": "ExistingReport",
"sourceReport": {
"sourceReportId": msg.source.report.id,
"sourceWorkspaceId": msg.source.workspace.id }
},
headers: {
'Authorization': 'Bearer ' + node.connection.accesstoken
}}, ProcessResponse);
}
break;
};
});
}
RED.nodes.registerType('powerbi-reports', PowerBIReports);
}