src/InsuranceCompany/Bulstrad/SOAP/Subscriber/ErrorHandlingSubscriber.php line 22

Open in your IDE?
  1. <?php
  2. namespace App\InsuranceCompany\Bulstrad\SOAP\Subscriber;
  3. use App\InsuranceCompany\Bulstrad\Exception\Exception;
  4. use App\InsuranceCompany\Bulstrad\SOAP\Interfaces\ResponseInterface;
  5. use App\InsuranceCompany\Bulstrad\SOAP\Interfaces\StatusMessageTypeInterface;
  6. use Phpro\SoapClient\Event\ResponseEvent;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use UnexpectedValueException;
  9. /**
  10.  * Class ErrorHandlingSubscriber
  11.  */
  12. class ErrorHandlingSubscriber implements EventSubscriberInterface
  13. {
  14.     /**
  15.      * @param ResponseEvent $event
  16.      * @throws Exception
  17.      */
  18.     public function onClientResponse(ResponseEvent $event)
  19.     {
  20.         $response = $event->getResponse();
  21.         if (!($response instanceof ResponseInterface)) {
  22.             throw new UnexpectedValueException('Response type is not a ResponseInterface');
  23.         }
  24.         $status = $response->getStatus();
  25.         $result = $status->getResult();
  26.         if ($result === 0) {
  27.             return;
  28.         }
  29.         /**
  30.          * @var StatusMessageTypeInterface[] $messages
  31.          */
  32.         $messages = $status->getMessages()->getMessage();
  33.         $errorMessage = implode('; ', array_map(function(StatusMessageTypeInterface $message) {
  34.             return $message->getCode() . ': ' . $message->getDescription();
  35.         }, $messages));
  36.         $exception = new Exception(
  37.             message: $errorMessage,
  38.             code: $result,
  39.             messages: $messages,
  40.         );
  41.         $internalServerError = $exception->getMessageByCode('OSB-380001');
  42.         if ($internalServerError?->getDescription() === 'Internal Server Error') {
  43.             $exception = new Exception(
  44.                 message: 'Проблем при комуникацията със застрахователна компания Булстрад',
  45.                 code: $result,
  46.                 messages: $messages,
  47.             );
  48.         }
  49.         $loginError = $exception->getMessageByCode('SOA_ERROR');
  50.         if (str_contains($loginError?->getDescription() ?? '', 'WEB.COMMON.LOGIN.NO_SUCH_USER')) {
  51.             $exception = new Exception(
  52.                 message: 'В момента няма достъп до застрахователна компания Булстрад',
  53.                 code: $result,
  54.                 messages: $messages,
  55.             );
  56.         }
  57.         throw $exception;
  58.     }
  59.     /**
  60.      * {@inheritdoc}
  61.      * @noinspection PhpArrayShapeAttributeCanBeAddedInspection
  62.      */
  63.     public static function getSubscribedEvents(): array
  64.     {
  65.         return [
  66.             ResponseEvent::class => 'onClientResponse',
  67.         ];
  68.     }
  69. }