From 589787f0243c0de977048600bac2e3bad12c1b98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Thu, 27 Mar 2025 09:56:00 +0100 Subject: [PATCH] feat: improved exception handling --- src/BusProNet/ApiClient.php | 26 ++++----- src/Controller/Booking/DownloadController.php | 3 +- src/Controller/Booking/EditController.php | 57 ++++++++++--------- src/Controller/Booking/IndexController.php | 3 +- src/Controller/PersonalDataController.php | 7 +-- src/Controller/RegistrationController.php | 3 +- src/Controller/ResetPasswordController.php | 2 +- 7 files changed, 50 insertions(+), 51 deletions(-) diff --git a/src/BusProNet/ApiClient.php b/src/BusProNet/ApiClient.php index 2310326..89763bc 100644 --- a/src/BusProNet/ApiClient.php +++ b/src/BusProNet/ApiClient.php @@ -46,7 +46,6 @@ class ApiClient /** * @throws ApiClientException - * @throws ResponseParserException */ public function getPersonalData(string $email, string $password): Notification|PersonalData { @@ -64,7 +63,6 @@ class ApiClient /** * @throws ApiClientException - * @throws ResponseParserException */ public function register(RegistrationData $registrationData): Notification { @@ -88,7 +86,6 @@ class ApiClient /** * @throws ApiClientException - * @throws ResponseParserException */ public function resetPassword(string $email): Notification { @@ -105,7 +102,6 @@ class ApiClient /** * @throws ApiClientException - * @throws ResponseParserException */ public function updatePersonalData( string $email, @@ -129,7 +125,6 @@ class ApiClient /** * @throws ApiClientException - * @throws ResponseParserException */ public function updateNewsletterRegistration(string $email, string $password, PersonalData $personalData): Notification|PersonalData { @@ -152,7 +147,6 @@ class ApiClient /** * @throws ApiClientException - * @throws ResponseParserException */ public function getBookings(string $email, string $password): Notification|BaseData { @@ -168,6 +162,9 @@ class ApiClient return $this->sendRequest(static::TYPE_CUSTOMER_DATA, $data); } + /** + * @throws ApiClientException + */ public function getBooking(string $email, string $password, int $id): Notification|Booking { $data = [ @@ -185,7 +182,6 @@ class ApiClient /** * @throws ApiClientException - * @throws ResponseParserException */ public function updateBooking(BookingData $formData, bool $debug = false): Notification|BookingUpdate { @@ -204,7 +200,6 @@ class ApiClient /** * @throws ApiClientException - * @throws ResponseParserException */ public function getMutableData(int $id): Notification|BaseData { @@ -221,7 +216,6 @@ class ApiClient /** * @throws ApiClientException - * @throws ResponseParserException */ public function getAvailabilities(int $id): Notification|BaseData { @@ -237,7 +231,6 @@ class ApiClient /** * @throws ApiClientException - * @throws ResponseParserException */ public function getCrmAttributes(string $email, string $password): Notification|CrmAttributes { @@ -255,7 +248,6 @@ class ApiClient /** * @throws ApiClientException - * @throws ResponseParserException */ public function getBaseData(string $type): Notification|BaseData { @@ -270,7 +262,6 @@ class ApiClient /** * @throws ApiClientException - * @throws ResponseParserException */ public function getDocuments(string $email, string $password, int $id, string $type): mixed { @@ -289,7 +280,6 @@ class ApiClient /** * @throws ApiClientException - * @throws ResponseParserException */ private function sendRequest(string $type, array $data, bool $debug = false): mixed { @@ -327,7 +317,15 @@ class ApiClient $this->dumpXmlToFile('response', $requestId, $xml); } - return $this->responseParser->parseXmlString($type, $xml); + try { + return $this->responseParser->parseXmlString($type, $xml); + } catch (ResponseParserException $e) { + $this->dumpXmlToFile('response', $requestId, $xml); + } + + throw new ApiClientException('Unexpected response received from API', [ + 'request_id' => $requestId, + ]); } private function dumpXmlToFile(string $type, string $requestId, string $body): void diff --git a/src/Controller/Booking/DownloadController.php b/src/Controller/Booking/DownloadController.php index 5daa983..2c99748 100644 --- a/src/Controller/Booking/DownloadController.php +++ b/src/Controller/Booking/DownloadController.php @@ -4,7 +4,6 @@ namespace App\Controller\Booking; use App\BusProNet\ApiClient; use App\BusProNet\Exception\ApiClientException; -use App\BusProNet\Exception\ResponseParserException; use App\BusProNet\Model\Notification; use Psr\Log\LoggerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; @@ -62,7 +61,7 @@ class DownloadController extends AbstractController $file = $this ->apiClient ->getDocuments($bpnUser->getEmail(), $bpnUser->getPassword(), $id, $type); - } catch (ApiClientException|ResponseParserException $e) { + } catch (ApiClientException $e) { $file = null; } diff --git a/src/Controller/Booking/EditController.php b/src/Controller/Booking/EditController.php index 7d0de41..5c2f2f0 100644 --- a/src/Controller/Booking/EditController.php +++ b/src/Controller/Booking/EditController.php @@ -73,7 +73,7 @@ class EditController extends AbstractController // Fetch mutability information via API try { $mutableData = $this->apiClient->getMutableData($bookingData->travelId); - } catch (ApiClientException|ResponseParserException $e) { + } catch (ApiClientException $e) { $this->addFlash('error', 'Reisedaten nicht (mehr) verfügbar'); return $this->redirectToRoute('app_bookings'); @@ -82,7 +82,7 @@ class EditController extends AbstractController // Fetch availability information via API try { $availabilities = $this->apiClient->getAvailabilities($bookingData->travelId); - } catch (ApiClientException|ResponseParserException $e) { + } catch (ApiClientException $e) { $this->addFlash('error', 'Reisedaten nicht (mehr) verfügbar'); return $this->redirectToRoute('app_bookings'); @@ -103,36 +103,41 @@ class EditController extends AbstractController $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $response = $this->apiClient->updateBooking($formData, true); $this->logger->info('Initiated booking update', [ 'email' => $bpnUser->getEmail(), 'booking_id' => $id, ]); - if ($response instanceof Notification) { - if (true === $response->isError()) { - $this->addFlash('error', $response->message); + + try { + $response = $this->apiClient->updateBooking($formData, true); + if ($response instanceof Notification) { + if (true === $response->isError()) { + $this->addFlash('error', $response->message); + } else { + $this->addFlash('info', $response->message); + } + $this->logger->error('Booking update not successful', [ + 'email' => $bpnUser->getEmail(), + 'booking_id' => $id, + 'message' => $response->message, + ]); } else { - $this->addFlash('info', $response->message); + try { + $this->cache->delete($cacheKey); + } catch (InvalidArgumentException $e) { + } + + $this->addFlash('success', 'Buchung erfolgreich aktualisiert'); + + $this->logger->info('Booking update successful', [ + 'email' => $bpnUser->getEmail(), + 'booking_id' => $id, + ]); + + return $this->redirectToRoute('app_booking_edit', ['id' => $id]); } - $this->logger->error('Booking update not successful', [ - 'email' => $bpnUser->getEmail(), - 'booking_id' => $id, - 'message' => $response->message, - ]); - } else { - try { - $this->cache->delete($cacheKey); - } catch (InvalidArgumentException $e) { - } - - $this->addFlash('success', 'Buchung erfolgreich aktualisiert'); - - $this->logger->info('Booking update successful', [ - 'email' => $bpnUser->getEmail(), - 'booking_id' => $id, - ]); - - return $this->redirectToRoute('app_booking_edit', ['id' => $id]); + } catch (ApiClientException $e) { + $this->addFlash('error', 'Es ist ein Fehler in der Kommunikation mit dem Buchungssystem aufgetreten'); } } diff --git a/src/Controller/Booking/IndexController.php b/src/Controller/Booking/IndexController.php index 260141b..d5fcae4 100644 --- a/src/Controller/Booking/IndexController.php +++ b/src/Controller/Booking/IndexController.php @@ -4,7 +4,6 @@ namespace App\Controller\Booking; use App\BusProNet\ApiClient; use App\BusProNet\Exception\ApiClientException; -use App\BusProNet\Exception\ResponseParserException; use App\BusProNet\Model\BaseData; use App\BusProNet\XmlLoader\TravelLoader; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; @@ -35,7 +34,7 @@ class IndexController extends AbstractController try { $bookings = $this->apiClient->getBookings($bpnUser->getEmail(), $bpnUser->getPassword()); - } catch (ApiClientException|ResponseParserException $e) { + } catch (ApiClientException $e) { $this->addFlash('error', 'Buchungen nicht abrufbar'); $bookings = new BaseData([]); } diff --git a/src/Controller/PersonalDataController.php b/src/Controller/PersonalDataController.php index 87cae47..7067c6a 100644 --- a/src/Controller/PersonalDataController.php +++ b/src/Controller/PersonalDataController.php @@ -4,7 +4,6 @@ namespace App\Controller; use App\BusProNet\ApiClient; use App\BusProNet\Exception\ApiClientException; -use App\BusProNet\Exception\ResponseParserException; use App\BusProNet\Model\PersonalData; use App\Form\PersonalDataType; use Psr\Log\LoggerInterface; @@ -38,7 +37,7 @@ class PersonalDataController extends AbstractController $personalData = $this ->apiClient ->getPersonalData($bpnUser->getEmail(), $bpnUser->getPassword()); - } catch (ApiClientException|ResponseParserException $e) { + } catch (ApiClientException $e) { $this->addFlash('error', 'Deine persönlichen Daten konnten nicht abgerufen werden'); $personalData = new PersonalData(); } @@ -82,7 +81,7 @@ class PersonalDataController extends AbstractController $personalData = $this ->apiClient ->getPersonalData($bpnUser->getEmail(), $bpnUser->getPassword()); - } catch (ApiClientException|ResponseParserException $e) { + } catch (ApiClientException $e) { $this->addFlash('error', 'Deine persönlichen Daten konnten nicht abgerufen werden'); $personalData = new PersonalData(); } @@ -95,7 +94,7 @@ class PersonalDataController extends AbstractController $this->logger->info('Updated newsletter registration', [ 'email' => $bpnUser->getEmail(), ]); - } catch (ApiClientException|ResponseParserException $e) { + } catch (ApiClientException $e) { $this->addFlash('error', $e->getMessage()); } diff --git a/src/Controller/RegistrationController.php b/src/Controller/RegistrationController.php index 4d21664..9e2e6f0 100644 --- a/src/Controller/RegistrationController.php +++ b/src/Controller/RegistrationController.php @@ -4,7 +4,6 @@ namespace App\Controller; use App\BusProNet\ApiClient; use App\BusProNet\Exception\ApiClientException; -use App\BusProNet\Exception\ResponseParserException; use App\Form\Model\RegistrationData; use App\Form\RegistrationType; use Psr\Log\LoggerInterface; @@ -43,7 +42,7 @@ class RegistrationController extends AbstractController $this->logger->info('Initiated registration', [ 'email' => $registrationData->email, ]); - } catch (ApiClientException|ResponseParserException $e) { + } catch (ApiClientException $e) { $this->addFlash('error', $e->getMessage()); $this->logger->error('Error initiating registration', [ 'email' => $registrationData->email, diff --git a/src/Controller/ResetPasswordController.php b/src/Controller/ResetPasswordController.php index 1ca5d72..2b795e2 100644 --- a/src/Controller/ResetPasswordController.php +++ b/src/Controller/ResetPasswordController.php @@ -52,7 +52,7 @@ class ResetPasswordController extends AbstractController $this->logger->info('Initiated password reset', [ 'email' => $form->get('email')->getData(), ]); - } catch (ApiClientException|ResponseParserException $e) { + } catch (ApiClientException $e) { $this->addFlash('error', $e->getMessage()); $this->logger->error('Error initiating password reset', [ 'email' => $form->get('email')->getData(),