Spaces:
No application file
No application file
| namespace MauticPlugin\MauticCrmBundle\Integration\Salesforce; | |
| use Mautic\PluginBundle\Exception\ApiErrorException; | |
| use Psr\Log\LoggerInterface; | |
| class ResultsPaginator | |
| { | |
| /** | |
| * @var array | |
| */ | |
| private $results; | |
| /** | |
| * @var int | |
| */ | |
| private $totalRecords = 0; | |
| private int $recordCount = 0; | |
| private int $retryCount = 0; | |
| /** | |
| * @var string|null | |
| */ | |
| private $nextRecordsUrl; | |
| /** | |
| * @param string $salesforceBaseUrl | |
| */ | |
| public function __construct( | |
| private LoggerInterface $logger, | |
| private $salesforceBaseUrl | |
| ) { | |
| } | |
| /** | |
| * @return $this | |
| * | |
| * @throws ApiErrorException | |
| */ | |
| public function setResults(array $results) | |
| { | |
| if (!isset($results['records'])) { | |
| throw new ApiErrorException(var_export($results, true)); | |
| } | |
| $this->results = $results; | |
| $this->totalRecords = $results['totalSize']; | |
| $this->recordCount += count($results['records']); | |
| return $this; | |
| } | |
| /** | |
| * @return string | |
| * | |
| * @throws ApiErrorException | |
| */ | |
| public function getNextResultsUrl() | |
| { | |
| if (isset($this->results['nextRecordsUrl'])) { | |
| $this->retryCount = 0; | |
| $this->nextRecordsUrl = $this->results['nextRecordsUrl']; | |
| if (!str_contains($this->nextRecordsUrl, $this->salesforceBaseUrl)) { | |
| $this->nextRecordsUrl = $this->salesforceBaseUrl.$this->nextRecordsUrl; | |
| } | |
| return $this->nextRecordsUrl; | |
| } | |
| if ($this->recordCount < $this->totalRecords) { | |
| // Something has gone wrong so try a few more times before giving up | |
| if ($this->retryCount <= 5) { | |
| $this->logger->debug("SALESFORCE: Processed less than total but didn't get a nextRecordsUrl in the response: ".var_export($this->results, true)); | |
| usleep(500); | |
| ++$this->retryCount; | |
| // Try again | |
| return $this->nextRecordsUrl; | |
| } | |
| // Throw an exception cause something isn't right | |
| throw new ApiErrorException("Expected to process {$this->totalRecords} but only processed {$this->recordCount}: ".var_export($this->results, true)); | |
| } | |
| $this->nextRecordsUrl = null; | |
| return ''; | |
| } | |
| public function getTotal(): int | |
| { | |
| return (int) $this->totalRecords; | |
| } | |
| } | |