<?php
namespace App\EventListener;
use App\Atd\Supplier\Atd\Voucher\Service\VoucherService;
use App\Atd\Utilities\HttpClientResponse;
use App\enum\Events;
use App\Event\VoucherUploadEvent;
use App\Event\VoucherUploadFailEvent;
use App\Event\VoucherUploadSuccessEvent;
use Psr\EventDispatcher\EventDispatcherInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class VoucherUploadSubscriber implements EventSubscriberInterface
{
public function __construct(
private readonly VoucherService $voucherService,
private readonly LoggerInterface $logger,
private readonly EventDispatcherInterface $eventDispatcher
) {
}
public static function getSubscribedEvents(): array
{
return [
Events::VOUCHER_UPLOAD_TRIGGER => 'onVoucherUploadTriggered',
Events::VOUCHER_UPLOAD_SUCCESS => 'onUploadSucceeded',
Events::VOUCHER_UPLOAD_FAIL => 'onUploadFailed',
];
}
/**
* @throws \Throwable
*/
public function onVoucherUploadTriggered(VoucherUploadEvent $event): void
{
$voucherDto = $event->getVoucherDto();
$voucherFileId = $voucherDto->getMeta()['voucher_id'];
$this->logger->info(sprintf('Uploading Voucher File ID [%s]', $voucherFileId));
try {
/** @var HttpClientResponse $response */
$response = $this->voucherService->upload($voucherDto);
if ('success' == $response->getStatus()) {
$this->eventDispatcher->dispatch(new VoucherUploadSuccessEvent($voucherDto, $response), Events::VOUCHER_UPLOAD_SUCCESS);
} else {
$this->eventDispatcher->dispatch(new VoucherUploadFailEvent($voucherDto, $response), Events::VOUCHER_UPLOAD_FAIL);
}
} catch (\Throwable $e) {
$this->logger->error($e->getMessage());
// maybe dispatch general error here
throw $e;
}
}
public function onUploadSucceeded(VoucherUploadSuccessEvent $event): void
{
$this->logger->info(
sprintf('Voucher Upload (voucher_file_id)[%s] Success [%s]',
$event->getVoucherDto()->getMeta()['voucher_id'],
$event->getClientResponse()->getPhrase()
)
);
}
public function onUploadFailed(VoucherUploadFailEvent $event): void
{
$this->logger->error(
sprintf('Voucher Upload (voucher_file_id)[%s] FAILED [%s]',
$event->getVoucherDto()->getMeta()['voucher_id'],
$event->getClientResponse()->getPhrase()
)
);
}
}