UNPKG

tuain-powerbi-report

Version:

Tuain Framework to obtain a Power BI embedded report

119 lines (111 loc) 3.86 kB
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 };