<?php
namespace App\InsuranceCompany\Bulstrad\SOAP\Subscriber;
use App\InsuranceCompany\Bulstrad\Exception\Exception;
use App\InsuranceCompany\Bulstrad\SOAP\Interfaces\ResponseInterface;
use App\InsuranceCompany\Bulstrad\SOAP\Interfaces\StatusMessageTypeInterface;
use Phpro\SoapClient\Event\ResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use UnexpectedValueException;
/**
* Class ErrorHandlingSubscriber
*/
class ErrorHandlingSubscriber implements EventSubscriberInterface
{
/**
* @param ResponseEvent $event
* @throws Exception
*/
public function onClientResponse(ResponseEvent $event)
{
$response = $event->getResponse();
if (!($response instanceof ResponseInterface)) {
throw new UnexpectedValueException('Response type is not a ResponseInterface');
}
$status = $response->getStatus();
$result = $status->getResult();
if ($result === 0) {
return;
}
/**
* @var StatusMessageTypeInterface[] $messages
*/
$messages = $status->getMessages()->getMessage();
$errorMessage = implode('; ', array_map(function(StatusMessageTypeInterface $message) {
return $message->getCode() . ': ' . $message->getDescription();
}, $messages));
$exception = new Exception(
message: $errorMessage,
code: $result,
messages: $messages,
);
$internalServerError = $exception->getMessageByCode('OSB-380001');
if ($internalServerError?->getDescription() === 'Internal Server Error') {
$exception = new Exception(
message: 'Проблем при комуникацията със застрахователна компания Булстрад',
code: $result,
messages: $messages,
);
}
$loginError = $exception->getMessageByCode('SOA_ERROR');
if (str_contains($loginError?->getDescription() ?? '', 'WEB.COMMON.LOGIN.NO_SUCH_USER')) {
$exception = new Exception(
message: 'В момента няма достъп до застрахователна компания Булстрад',
code: $result,
messages: $messages,
);
}
throw $exception;
}
/**
* {@inheritdoc}
* @noinspection PhpArrayShapeAttributeCanBeAddedInspection
*/
public static function getSubscribedEvents(): array
{
return [
ResponseEvent::class => 'onClientResponse',
];
}
}