<?php
declare(strict_types=1);
namespace FMT\Application\Listener;
use DateTime;
use FMT\Data\Entity\DwollaEvent;
use FMT\Domain\Repository\BookstoreTransferRepositoryInterface;
use FMT\Domain\Repository\DwollaEventRepositoryInterface;
use FMT\Infrastructure\Service\Payments\Dwolla\Item\Webhook;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
/**
* Class DwollaEventListener
*/
class DwollaEventListener
{
/**
* @var DwollaEventRepositoryInterface
*/
protected $dwollaEventRepository;
protected BookstoreTransferRepositoryInterface $bookstoreTransferRepository;
/**
* @param DwollaEventRepositoryInterface $dwollaEventRepository
*/
public function __construct(
DwollaEventRepositoryInterface $dwollaEventRepository,
BookstoreTransferRepositoryInterface $bookstoreTransferRepository
) {
$this->dwollaEventRepository = $dwollaEventRepository;
$this->bookstoreTransferRepository = $bookstoreTransferRepository;
}
/**
* @param ControllerEvent $event
*/
public function onController(ControllerEvent $event)
{
$request = $event->getRequest();
if (!$request->attributes->has('_dwolla_webhook') || !$request->attributes->has('webhook')) {
return;
}
/** @var Webhook $webhook */
$webhook = $request->attributes->get('webhook');
$dwollaEvent = $this->dwollaEventRepository->findById($webhook->getId());
$bookstoreTransfer = $this->bookstoreTransferRepository->findByResourceId($webhook->getResourceId());
if ($dwollaEvent instanceof DwollaEvent) {
$event->setController(function () {
return new Response();
});
return;
}
$dwollaEvent = new DwollaEvent();
$dwollaEvent
->setId($webhook->getId())
->setCreated($webhook->getCreated())
->setReceived(new DateTime())
->setTopic($webhook->getTopic())
->setBookstoreTransfer($bookstoreTransfer)
;
$this->dwollaEventRepository->add($dwollaEvent);
$this->dwollaEventRepository->save($dwollaEvent);
}
}