public function getPowerBiEmbedToken()

in modules/quanthub_core/src/PowerBIEmbedConfigs.php [156:231]


  public function getPowerBiEmbedToken($token, $reportId, $datasetIds) {
    $powerbiAPIURL = 'https://api.powerbi.com/v1.0/myorg/GenerateToken';
    $powerbiUser = getenv('POWERBI_PUBLIC_USER');
    $powerbiRole = getenv('POWERBI_PUBLIC_ROLE');

    $entitledDatasets = [];
    foreach ($datasetIds as $datasetId) {
      $response = $this->getPowerBiDataset($token, $datasetId);
      if ($response['isEffectiveIdentityRequired'] && $response['isEffectiveIdentityRolesRequired']) {
        $entitledDatasets[] = $datasetId;
      }
    }

    $datasets = [];
    foreach ($datasetIds as $datasetId) {
      $datasets[] = [
        'id' => $datasetId,
        'xmlaPermissions' => 'ReadOnly',
      ];
    }

    $payload = [
      'accessLevel' => 'View',
      'datasets' => $datasets,
      'reports' => [['id' => $reportId]],
      'targetWorkspaces' => [['id' => $this->getWorkspaceID()]],
    ];

    if (count($entitledDatasets) > 0) {
      $payload['identities'] = [
        [
          'username' => $powerbiUser,
          'roles' => [$powerbiRole],
          'datasets' => $entitledDatasets,
        ],
      ];
    }

    $payload_json = json_encode($payload);

    try {
      $request = $this->httpClient->request(
        'POST',
        $powerbiAPIURL,
        [
          'headers' => [
            'Authorization' => 'Bearer ' . $token,
            'Cache-Control' => 'no-cache',
            'Content-Type' => 'application/json',
          ],
          'connect_timeout' => 30,
          'allow_redirects' => [
            'max' => 10,
          ],
          'body' => $payload_json,
        ]
      );
    }
    catch (\Exception $e) {
      $this->loggerFactory->error('getPowerBIEmbedToken: ' . $e->getMessage());
      return NULL;
    }

    $tokenResponse = json_decode($request->getBody(), TRUE);

    if (isset($tokenResponse['error'])) {
      if (isset($tokenResponse['error']['message'])) {
        $this->loggerFactory->error('error: ' . $tokenResponse['error']['message']);
      }
      else {
        $this->loggerFactory->error('error: ' . $tokenResponse['error']);
      }
      return NULL;
    }
    return $tokenResponse;
  }