<?php
namespace App\MessageHandler;
use App\Entity\Task;
use App\Message\SendCampaignMessage;
use App\Service\Api\Api;
use App\Service\Api\Tasks;
use App\Service\Campaign\Sender\SendgridSender;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
use Symfony\Contracts\Service\ServiceSubscriberInterface;
class SendCampaignHandler implements MessageHandlerInterface, ServiceSubscriberInterface, EventSubscriberInterface {
/**
* @var EntityManagerInterface
*/
private $em;
/**
* @var ContainerInterface
*/
private $locator;
/**
* @var Api
*/
private $api;
private $logger;
public function __construct(EntityManagerInterface $em, ContainerInterface $locator, LoggerInterface $logger, Api $api)
{
$this->em = $em;
$this->locator = $locator;
$this->api = $api;
$this->logger = $logger;
}
static function getSubscribedServices()
{
return [
SendgridSender::class
];
}
static function getSubscribedEvents()
{
return [
WorkerMessageFailedEvent::class => [
['handleFailed', 10]
]
];
}
public function handleFailed(WorkerMessageFailedEvent $event)
{
print_r($event->getReceiverName());
}
public function __invoke(SendCampaignMessage $message)
{
$campaignEmail = $message->getCampaignEmail();
$campaignId = $message->getCampaignId();
$sender_class = $message->getSenderClass(); // App\Service\Campaign\Sender\SenderInterface
$sender = $this->locator->get($sender_class);
// Send batch
$sender->sendCampaign($campaignEmail);
$this->logger->debug('Batch Executed, attempting task update if task', [
'task_id' => $message->getTaskId(),
'contacts' => count($campaignEmail->getContacts())
]);
// Update task if we have one
if($message->getTaskId()){
$task = $this->em->find(Task::class, $message->getTaskId());
try{
$this->logger->debug('Batch Executed, attempting task update', [
'task_id' => $task->getId(),
'contacts' => count($campaignEmail->getContacts())
]);
$this->api->get(Tasks::class)->increaseProgress($task, count($campaignEmail->getContacts()));
} catch (\Exception $e){
$this->logger->error('Error updating task progress: '.$e->getMessage(), [
'task_id' => $task->getId(),
'contacts' => count($campaignEmail->getContacts())
]);
}
}
}
}