* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0 */ namespace PrestaShop\Module\PrestashopFacebook\Provider; use GuzzleHttp\Psr7\Request; use PrestaShop\Module\PrestashopFacebook\Adapter\ConfigurationAdapter; use PrestaShop\Module\PrestashopFacebook\API\ResponseListener; use PrestaShop\Module\PrestashopFacebook\Config\Config; use PrestaShop\Module\PrestashopFacebook\Exception\FacebookAccountException; use PrestaShop\Module\PrestashopFacebook\Factory\ApiClientFactoryInterface; use Prestashop\ModuleLibGuzzleAdapter\Interfaces\HttpClientInterface; class ProductSyncReportProvider { /** * @var ConfigurationAdapter */ private $configurationAdapter; /** * @var HttpClientInterface */ private $psApiClient; /** * @var ResponseListener */ private $responseListener; public function __construct( ConfigurationAdapter $configurationAdapter, ApiClientFactoryInterface $psApiClientFactory, ResponseListener $responseListener ) { $this->configurationAdapter = $configurationAdapter; $this->responseListener = $responseListener; $this->psApiClient = $psApiClientFactory->createClient(); } public function getProductSyncReport() { $businessId = $this->configurationAdapter->get(Config::PS_FACEBOOK_EXTERNAL_BUSINESS_ID); $response = $this->responseListener->handleResponse( $this->psApiClient->sendRequest( new Request( 'GET', "/account/{$businessId}/reporting" ) ), [ 'exceptionClass' => FacebookAccountException::class, ] ); $responseContent = $response->getBody(); if (!$response->isSuccessful()) { $responseContent = []; } return $this->fixMissingValues($responseContent); } private function fixMissingValues($response) { if (!isset($response['errors'])) { $response['errors'] = []; } if (!isset($response['lastFinishedSyncStartedAt'])) { $response['lastFinishedSyncStartedAt'] = 0; } $response['errors'] = array_filter($response['errors'], [$this, 'filterErrorsWithoutMessage']); return $response; } /** * Hotfix as the Nest API should not return products without message * * @return bool */ private function filterErrorsWithoutMessage(array $productInError) { return !empty($productInError); } }