From b21de75b7fd111a37302acecbb871b17e135aec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Mon, 13 Jul 2026 12:23:57 +0200 Subject: [PATCH] fix: make import command resilient to api errors --- .../DataProvider/CountryDataProvider.php | 23 +++++++++++++------ .../DataProvider/HotelDataProvider.php | 23 +++++++++++++------ .../DataProvider/PickupDataProvider.php | 23 +++++++++++++------ 3 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/BusProNet/DataProvider/CountryDataProvider.php b/src/BusProNet/DataProvider/CountryDataProvider.php index 7017f55..a944c1d 100644 --- a/src/BusProNet/DataProvider/CountryDataProvider.php +++ b/src/BusProNet/DataProvider/CountryDataProvider.php @@ -5,13 +5,18 @@ namespace App\BusProNet\DataProvider; use App\BusProNet\ApiClient; use App\BusProNet\ApiClientException; use App\BusProNet\Model\Country; +use App\BusProNet\Model\NotificationResponse; +use Psr\Log\LoggerInterface; use Symfony\Contracts\Cache\CacheInterface; use Symfony\Contracts\Cache\ItemInterface; class CountryDataProvider { - public function __construct(private readonly ApiClient $apiClient, private readonly CacheInterface $cache) - { + public function __construct( + private readonly ApiClient $apiClient, + private readonly CacheInterface $cache, + private readonly LoggerInterface $logger, + ) { } public function getAll(): array @@ -20,11 +25,15 @@ class CountryDataProvider $countries = $this->cache->get('bpn_countries', function (ItemInterface $item) { $item->expiresAfter(3600); - return $this - ->apiClient - ->getBaseData(ApiClient::TYPE_BASE_DATA_COUNTRIES) - ->getItems() - ; + $response = $this->apiClient->getBaseData(ApiClient::TYPE_BASE_DATA_COUNTRIES); + + if ($response instanceof NotificationResponse) { + $this->logger->error('Unable to fetch country base data from BusProNet. Code: '.$response->getCode().', Message: '.$response->getMessage()); + + throw new ApiClientException('Unable to fetch country base data from BusProNet'); + } + + return $response->getItems(); }); } catch (ApiClientException $e) { $countries = []; diff --git a/src/BusProNet/DataProvider/HotelDataProvider.php b/src/BusProNet/DataProvider/HotelDataProvider.php index fe78099..923b5ca 100644 --- a/src/BusProNet/DataProvider/HotelDataProvider.php +++ b/src/BusProNet/DataProvider/HotelDataProvider.php @@ -5,14 +5,19 @@ namespace App\BusProNet\DataProvider; use App\BusProNet\ApiClient; use App\BusProNet\ApiClientException; use App\BusProNet\Model\Hotel; +use App\BusProNet\Model\NotificationResponse; use Psr\Cache\InvalidArgumentException; +use Psr\Log\LoggerInterface; use Symfony\Contracts\Cache\CacheInterface; use Symfony\Contracts\Cache\ItemInterface; class HotelDataProvider { - public function __construct(private readonly ApiClient $apiClient, private readonly CacheInterface $cache) - { + public function __construct( + private readonly ApiClient $apiClient, + private readonly CacheInterface $cache, + private readonly LoggerInterface $logger, + ) { } public function getAll(): array @@ -21,11 +26,15 @@ class HotelDataProvider $hotels = $this->cache->get('bpn_hotels', function (ItemInterface $item) { $item->expiresAfter(3600); - return $this - ->apiClient - ->getBaseData(ApiClient::TYPE_BASE_DATA_HOTELS) - ->getItems() - ; + $response = $this->apiClient->getBaseData(ApiClient::TYPE_BASE_DATA_HOTELS); + + if ($response instanceof NotificationResponse) { + $this->logger->error('Unable to fetch hotel base data from BusProNet. Code: '.$response->getCode().', Message: '.$response->getMessage()); + + throw new ApiClientException('Unable to fetch hotel base data from BusProNet'); + } + + return $response->getItems(); }); } catch (ApiClientException|InvalidArgumentException $e) { $hotels = []; diff --git a/src/BusProNet/DataProvider/PickupDataProvider.php b/src/BusProNet/DataProvider/PickupDataProvider.php index b573f99..be9e94c 100644 --- a/src/BusProNet/DataProvider/PickupDataProvider.php +++ b/src/BusProNet/DataProvider/PickupDataProvider.php @@ -4,14 +4,19 @@ namespace App\BusProNet\DataProvider; use App\BusProNet\ApiClient; use App\BusProNet\ApiClientException; +use App\BusProNet\Model\NotificationResponse; use App\BusProNet\Model\Pickup; +use Psr\Log\LoggerInterface; use Symfony\Contracts\Cache\CacheInterface; use Symfony\Contracts\Cache\ItemInterface; class PickupDataProvider { - public function __construct(private readonly ApiClient $apiClient, private readonly CacheInterface $cache) - { + public function __construct( + private readonly ApiClient $apiClient, + private readonly CacheInterface $cache, + private readonly LoggerInterface $logger, + ) { } public function getAll(): array @@ -20,11 +25,15 @@ class PickupDataProvider $pickups = $this->cache->get('bpn_pickups', function (ItemInterface $item) { $item->expiresAfter(3600); - return $this - ->apiClient - ->getBaseData(ApiClient::TYPE_BASE_DATA_PICKUPS) - ->getItems() - ; + $response = $this->apiClient->getBaseData(ApiClient::TYPE_BASE_DATA_PICKUPS); + + if ($response instanceof NotificationResponse) { + $this->logger->error('Unable to fetch pickup base data from BusProNet. Code: '.$response->getCode().', Message: '.$response->getMessage()); + + throw new ApiClientException('Unable to fetch pickup base data from BusProNet'); + } + + return $response->getItems(); }); } catch (ApiClientException $e) { $pickups = [];