Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
228 changes: 209 additions & 19 deletions src/Client/CxReportsClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,18 @@
use CxReports\Models\TemporaryData;
use CxReports\Models\TemporaryDataCreate;
use CxReports\Models\NonceToken;
use CxReports\Models\ReportExportRequest;
use CxReports\Models\ReportPage;
use CxReports\Models\ReportPDF;
use CxReports\Models\AsyncReportGenerationRequest;
use CxReports\Models\AsyncReportGenerationResponse;
use CxReports\Models\DocumentFIleFormat;
use CxReports\Models\Job;
use CxReports\Models\JobRun;
use CxReports\Models\JobRunRequest;
use CxReports\Models\JobRunStatus;
use CxReports\Models\TemporaryFileStatusResponse;


class CxReportsClient
{
Expand All @@ -24,7 +35,7 @@ public function __construct($url, $workspace_id, $pat, Client $client = null)
$this->url = $url;
$this->pat = $pat;
$this->default_workspace_id = $workspace_id;
if($client == null){
if ($client == null) {
$this->client = new Client([
'base_uri' => $this->url,
'headers' => [
Expand All @@ -37,14 +48,114 @@ public function __construct($url, $workspace_id, $pat, Client $client = null)
}
}

public function getAsyncExportStatus($tempFileId, $workspace_id = null)
{
$url = $this->buildUrlWithWorkspace('exports/' . $tempFileId . '/status', $workspace_id);
try {
$response = $this->client->get($url);
$data = $this->processResponse($response);
return new TemporaryFileStatusResponse($data);
} catch (RequestException $e) {
return new \Exception('Error getting export status');
}
}

public function getAsyncExportContent($tempFileId, $workspace_id = null)
{
$url = $this->buildUrlWithWorkspace('exports/' . $tempFileId . '/content', $workspace_id);
try {
$response = $this->client->get($url);
$reportName = $response->getHeader('Content-Disposition')[0];
//filename="Sample report.pdf"; filename*=UTF-8''Sample%20report.pdf.......
// extract the filename from the header
$reportName = explode('filename*=UTF-8\'\'', $reportName)[1];
$reportName = str_replace('"', '', $reportName);
$reportName = str_replace(' ', '_', $reportName);
$reportName = urldecode($reportName);
$pdf = $response->getBody()->getContents();
return new ReportPDF([
'filename' => $reportName,
'pdf' => $pdf,
]);
} catch (RequestException $e) {
return new \Exception('Error fetching report pages');
}
}

public function listJobs($workspace_id = null)
{
$url = $this->buildUrlWithWorkspace('jobs', $workspace_id);

try {
$response = $this->client->get($url);
$data = $this->processResponse($response);

$jobs = array_map(function ($jobData) {
return new Job($jobData);
}, $data);
return $jobs;
} catch (RequestException $e) {
return new \Exception('Error fetching jobs');
}
}

public function startNewJobRun($jobid, JobRunRequest $requestBody, $workspace_id = null)
{
$url = $this->buildUrlWithWorkspace('jobs/' . $jobid . '/runs', $workspace_id);
try {
$response = $this->client->post($url, [
'json' => $requestBody
]);
$data = $this->processResponse($response);
return new JobRun($data);
} catch (RequestException $e) {
return new \Exception('Error starting new Job Run');
}
}

public function getJobRunStatus($jobid, $runId, $workspace_id = null)
{
$url = $this->buildUrlWithWorkspace('jobs/' . $jobid . '/runs/' . $runId . '/status', $workspace_id);
try {
$response = $this->client->get($url);
$data = $this->processResponse($response);
return new JobRunStatus($data);
} catch (RequestException $e) {
return new \Exception('Error fetching JobRun status');
}
}

public function generateJobRunReviewDocument($jobid, $runId, $workspace_id = null)
{
$url = $this->buildUrlWithWorkspace('jobs/' . $jobid . '/runs/' . $runId . '/generate-review-document', $workspace_id);
try {
$response = $this->client->post($url);
$data = $this->processResponse($response);
return new AsyncReportGenerationResponse($data);
} catch (RequestException $e) {
return new \Exception('Error generating Job Run review document');
}
}

public function deliverAllJobRunEntries($jobid, $runId, $workspace_id = null)
{
$url = $this->buildUrlWithWorkspace('jobs/' . $jobid . '/runs/' . $runId . '/deliver', $workspace_id);
try {
$response = $this->client->post($url);
return true;
} catch (RequestException $e) {
return new \Exception('Error generating Job Run review document');
}
}

public function listReports($type, $workspace_id = null)
{
$url = $this->buildUrlWithWorkspace('reports?type=' . $type, $workspace_id );
$url = $this->buildUrlWithWorkspace('reports?type=' . $type, $workspace_id);

try {
$response = $this->client->get($url);
$data = $this->processResponse($response);

$reports = array_map(function ($reportData) {
return new Report($reportData);
}, $data);
Expand All @@ -54,6 +165,23 @@ public function listReports($type, $workspace_id = null)
}
}

public function listReportPages($reportId, $workspace_id = null)
{
$url = $this->buildUrlWithWorkspace('reports/' . $reportId . '/pages', $workspace_id);
try {
$response = $this->client->get($url);
$data = $this->processResponse($response);

$reportPages = array_map(function ($pageData) {
return new ReportPage($pageData);
}, $data);
return $reportPages;
} catch (RequestException $e) {
return new \Exception('Error fetching report pages');
}
}


public function downloadPdf($reportId, $params = [], $workspace_id = null)
{
$url = $this->buildUrlWithWorkspace('reports/' . $reportId . '/pdf', $workspace_id);
Expand All @@ -80,6 +208,51 @@ public function downloadPdf($reportId, $params = [], $workspace_id = null)
}
}


public function downloadPdfWithData($reportId, ReportExportRequest $requestBody, $workspace_id = null)
{
$url = $this->buildUrlWithWorkspace('reports/' . $reportId . '/pdf', $workspace_id);

try {
$response = $this->client->post($url, [
'json' => $requestBody,
]);

$reportName = $response->getHeader('Content-Disposition')[0];
// filename="Sample report.pdf"; filename*=UTF-8''Sample%20report.pdf.......
// extract the filename from the header
$reportName = explode('filename*=UTF-8\'\'', $reportName)[1];
$reportName = str_replace('"', '', $reportName);
$reportName = str_replace(' ', '_', $reportName);
$reportName = urldecode($reportName);

$pdf = $response->getBody()->getContents();

return new ReportPDF([
'filename' => $reportName,
'pdf' => $pdf,
]);
} catch (RequestException $e) {
throw new \Exception('Error downloading document: ' . $e->getMessage());
}
}

public function startExport($reportId, AsyncReportGenerationRequest $requestBody, $workspace_id = null)
{
$url = $this->buildUrlWithWorkspace('reports/' . $reportId . '/export', $workspace_id);
try {
$response = $this->client->post($url, [
'json' => $requestBody,
]);
$exportResponse = $this->processResponse($response);
return new AsyncReportGenerationResponse($exportResponse);
} catch (RequestException $th) {
throw new \Exception('Failed to start async export: ' . $th->getMessage());
}
}



public function getReportTypes($workspace_id = null)
{
$url = $this->buildUrlWithWorkspace('report-types', $workspace_id);
Expand Down Expand Up @@ -127,7 +300,7 @@ public function getReportPreviewURL($reportId, $params = [], $workspace_id = nul
$prepared_params = $this->encodeReportPreviewParams($params);

$tempDataId = null;
if(!empty($data)){
if (!empty($data)) {
$prepared_data = json_encode($data);
$tmpData = $this->postTempData($prepared_data);
$tmpDataId = $tmpData->id;
Expand All @@ -139,13 +312,13 @@ public function getReportPreviewURL($reportId, $params = [], $workspace_id = nul
$nonce = $this->createNonceAuthToken()->nonce;

$queryParams = [];
if($prepared_params != null){
if ($prepared_params != null) {
$queryParams['params'] = $prepared_params;
}
if($prepared_data != null){
if ($prepared_data != null) {
$queryParams['data'] = $prepared_data;
}
if($nonce != null){
if ($nonce != null) {
$queryParams['nonce'] = $nonce;
}
$url = $this->url . '/ws/' . $ws . '/reports/' . $reportId . '/preview?' . http_build_query($queryParams);
Expand All @@ -168,47 +341,64 @@ public function postTempData($data, $workspace_id = null)
return new \Exception('Error posting temporary data');
}
}

private function processResponse($response){
if($response->getStatusCode() != 200){

private function processResponse($response)
{
if ($response->getStatusCode() != 200 && $response->getStatusCode() != 202) {
throw new \Exception('Error While running the request');
}
return json_decode($response->getBody(), true);
}

private function buildUrlWithWorkspace($path, $workspace_id = null){
private function buildUrlWithWorkspace($path, $workspace_id = null)
{
$ws = $workspace_id == null ? $this->default_workspace_id : $workspace_id;
return $this->url . '/api/v1/ws/' . $ws . '/' . $path;
}

private function buildUrl($path){
private function buildUrl($path)
{
return $this->url . '/api/v1/' . $path;
}

private function encodeReportPreviewParams($params){
private function encodeReportPreviewParams($params)
{
$prepared_params = [];
if(!empty($params['params'])){
if (!empty($params['params'])) {
$prepared_params['params'] = json_encode($params['params']);
} else {
$prepared_params['params'] = null;
}
if(!empty($params['data'])){
if (!empty($params['data'])) {
$prepared_params['data'] = json_encode($params['data']);
} else {
$prepared_params['data'] = null;
}
if(!empty($params['nonce'])){
if (!empty($params['nonce'])) {
$prepared_params['nonce'] = $params['nonce'];
}
if(!empty($params['tempDataId'])){
if (!empty($params['tempDataId'])) {
$prepared_params['tempDataId'] = $params['tempDataId'];
}
if(!empty($params['timezone'])){
if (!empty($params['timezone'])) {
$prepared_params['timezone'] = $params['timezone'];
} else {
$prepared_params['timezone'] = 'UTC';
}
if (!empty($params['format'])) {
$prepared_params['format'] = $params['format'];
} else {
$prepared_params['format'] = DocumentFIleFormat::pdf;
}
if (!empty($params['includeAttachments'])) {
$prepared_params['includeAttachments'] = $params['includeAttachments'];
} else {
$prepared_params['includeAttachments'] = false;
}
if (!empty($params['lang'])) {
$prepared_params['lang'] = $params['lang'];
}

return $prepared_params;
}
}
}
27 changes: 27 additions & 0 deletions src/Models/AsyncReportGenerationRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace CxReports\Models;

class AsyncReportGenerationRequest
{
public $params;
public $data;
public $lang;
public $timezone;
public $format;
public $includeAttachments;
public $excludePages;
public $tempDataId;

public function __construct($data = [])
{
$this->params = $data['params'] ?? null;
$this->data = $data['data'] ?? null;
$this->lang = $data['lang'] ?? null;
$this->timezone = $data['timezone'] ?? null;
$this->format = $data['format'] ?? null;
$this->includeAttachments = $data['includeAttachments'] ?? null;
$this->excludePages = $data['excludePages'] ?? null;
$this->tempDataId = $data['tempDataId'] ?? null;
}
}
13 changes: 13 additions & 0 deletions src/Models/AsyncReportGenerationResponse.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace CxReports\Models;

class AsyncReportGenerationResponse
{
public $temporaryFileId;

public function __construct($data)
{
$this->temporaryFileId = $data['temporaryFileId'];
}
}
11 changes: 11 additions & 0 deletions src/Models/DocumentFIleFormat.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

namespace CxReports\Models;

enum DocumentFIleFormat{
case pdf;
case docx;
case xlsx;
case pptx;
case html;
}
Loading