tuain-powerbi-report
Version:
Tuain Framework to obtain a Power BI embedded report
119 lines (111 loc) • 3.86 kB
JavaScript
const request = require('request-promise');
const querystring = require('querystring');
async function getReportData(powerbiConfig, reportName) {
let currentReport = null;
const { reports, pbiResource, applicationId, masterUser, masterPwd,
authPath, accessTokenField, mainErrorField, errorDetailField,
pbiReportsUrl, pbiEmbedTokenUrl } = powerbiConfig;
if (reports) {
const actualReportName = (!reportName || !reports[reportName])
? 'default' : reportName;
currentReport = reports[actualReportName];
}
if (!currentReport) {
let errorResponse = {
errorCode: '99',
errorMessage: 'No existe definición del reporte solicitado'
}
return [errorResponse, null];
}
const tokenRequest = {
method: 'POST',
headers: {
'Content-Length': tokenRequestFields.length,
'Content-Type': 'application/x-www-form-urlencoded',
Accept: 'application/json',
},
uri: authPath,
body: querystring.stringify({
grant_type: 'password',
scope: 'openid',
resource: pbiResource,
client_id: applicationId,
username: masterUser,
password: masterPwd,
}),
};
const tokenResponseStr = await request(tokenRequest);
const tokenResponse = JSON.parse(tokenResponseStr);
const accessToken = tokenResponse[accessTokenField];
if (!accessToken) {
let errorDescription = tokenResponse[mainErrorField] || ''
errorDescription += ' - ' + tokenResponse[errorDetailField] || ''
let errorResponse = {
errorCode: '99',
errorMessage: errorDescription
}
return [errorResponse, null]
}
const powerbiHttpRequest = {
method: 'GET',
headers: { "Authorization": 'Bearer ' + accessToken },
url: `${pbiReportsUrl}/${currentReport.groupId}/reports`
};
const powerbiResponseStr = await request(powerbiHttpRequest);
const powerbiResponse = JSON.parse(powerbiResponseStr);
let embedUrl = null;
if (powerbiResponse && powerbiResponse.value && Array.isArray(powerbiResponse.value)) {
for (let index = 0; index < powerbiResponse.value.length; index++) {
const element = powerbiResponse.value[index];
if (element.id && element.id == reportName) {
embedUrl = powerbiResponse.value[index].embedUrl;
}
}
}
if (!embedUrl) {
let errorDescription = 'No fue posible obtener la información del reporte'
if (powerbiResponse.error) {
errorDescription = powerbiResponse.error.code || ''
errorDescription += ' - ' + powerbiResponse.error.message || ''
}
let errorResponse = {
errorCode: '99',
errorMessage: errorDescription
}
return [errorResponse, null]
}
let embedTokenRequestURL = `${pbiEmbedTokenUrl}/${currentReport.groupId}/`;
embedTokenRequestURL += `reports/${currentReport.reportId}/GenerateToken`;
let powerbiTokenRequest = {
method: 'POST',
headers: {
Authorization: 'Bearer ' + accessToken,
'Content-Type': 'application/x-www-form-urlencoded',
Accept: 'application/json'
},
url: embedTokenRequestURL,
body: JSON.stringify({ accessLevel: 'View', allowSaveAs: 'false' }),
json: true
};
let powerbiTokenResponse = await request(powerbiTokenRequest)
let embedToken = powerbiTokenResponse.token
if (!embedToken) {
let errorDescription = 'No fue posible obtener token de acceso para el reporte'
if (powerbiResponse.error) {
errorDescription = powerbiResponse.error.code || ''
errorDescription += ' - ' + powerbiResponse.error.message || ''
}
let errorResponse = {
errorCode: '99',
errorMessage: errorDescription
}
return [errorResponse, null]
}
let embedReportData = {
token: embedToken,
embedUrl: embedUrl,
reportId: currentReport.reportId
}
return [null, embedReportData]
}
module.exports = { getReportData };