@00f100/pbie-node
Version:
NodeJS library written in typescript and designed for using PowerBI embedded reports.
87 lines • 4.09 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const request_1 = __importDefault(require("request"));
const builder_1 = require("./builder");
const internals_1 = require("./internals");
exports.getReport = (config, url, options, reportId) => {
const { workspaceId } = config;
const promise = new Promise((resolve, reject) => {
if (!reportId)
return reject(new Error('No reportId provided'));
const callback = (error, { statusCode }, body) => {
if (error)
return reject(error);
if (statusCode >= 400)
return reject(new Error('Invalid request'));
if (!body || body === '')
return reject(new Error(`No report with id: ${reportId} in group with id: ${workspaceId}`));
try {
resolve(JSON.parse(body));
}
catch (error) {
reject(error);
}
};
request_1.default(url, options, callback);
});
return promise;
};
exports.getDataset = (config, accessToken, datasetId) => {
const { apiUrl, workspaceId } = config;
const { Authorization } = builder_1.buildAuthHeader(accessToken);
const options = { headers: { Authorization }, method: 'GET' };
const url = `${apiUrl}v1.0/myorg/groups/${workspaceId}/datasets/${datasetId}`;
const promise = new Promise((resolve, reject) => {
const callback = (error, { statusCode }, body) => {
if (error)
reject(error);
if (statusCode >= 400)
return reject(new Error('Request invalid'));
try {
const getReportRes = JSON.parse(body);
resolve(getReportRes);
}
catch (error) {
reject(error);
}
};
request_1.default(url, options, callback);
});
return promise;
};
exports.generateEmbedToken = async (config) => {
const { apiUrl, workspaceId, reportId } = config;
const { accessToken } = await internals_1.getAuthToken(config);
const { Authorization } = builder_1.buildAuthHeader(accessToken);
const headers = { Authorization, 'Content-Type': 'application/json' };
const options = { headers, method: 'POST', body: JSON.stringify({ accessLevel: 'View' }) };
const url = `${apiUrl}v1.0/myorg/groups/${workspaceId}/reports/${reportId}/GenerateToken`;
return internals_1.getEmbedToken(config, url, options, reportId);
};
exports.generateEmbedTokenWithRls = async (filter, config) => {
const { apiUrl, workspaceId, reportId, roles } = config;
const { accessToken } = await internals_1.getAuthToken(config);
const { Authorization } = builder_1.buildAuthHeader(accessToken);
const { url, options } = builder_1.buildRequestParams(config, accessToken, reportId);
const report = await exports.getReport(config, url, options, reportId);
if (report instanceof Error)
throw report;
const { id, datasetId } = report;
const dataset = await exports.getDataset(config, accessToken, datasetId);
if (dataset instanceof Error)
throw dataset;
if (!dataset.isEffectiveIdentityRequired)
throw new Error('EffectiveIdentityRequired');
const applyFilter = {};
applyFilter[filter.field] = filter.term;
const identities = [{ roles: filter.role, datasets: [datasetId], ...applyFilter }];
const body = { identities, accessLevel: 'View' };
const headers = { Authorization, 'Content-Type': 'application/json' };
const embedTokenOptions = { headers, method: 'POST', body: JSON.stringify(body) };
const embedTokenUrl = `${apiUrl}v1.0/myorg/groups/${workspaceId}/reports/${id}/GenerateToken`;
return internals_1.getEmbedToken(config, embedTokenUrl, embedTokenOptions, id);
};
//# sourceMappingURL=lib.js.map