<?php
namespace App\MessageHandler;
use App\Entity\Campaign;
use App\Entity\CampaignContact;
use App\Entity\CampaignLinkHit;
use App\Entity\Contact;
use App\Entity\SendEvent;
use App\Entity\Task;
use App\Event\CampaignContactUpdateEvent;
use App\Message\BatchSendCampaignMessage;
use App\Message\CreateFixtureMessage;
use App\Service\Api\Api;
use App\Service\Api\Tasks;
use App\Service\Campaign\CampaignEmailContact;
use App\Service\Campaign\Sender\SenderInterface;
use App\Service\Campaign\Sender\SendgridSender;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
use Symfony\Contracts\Service\ServiceSubscriberInterface;
class CreateFixtureHandler implements MessageHandlerInterface, ServiceSubscriberInterface, EventSubscriberInterface {
/**
* @var EntityManagerInterface
*/
private $em;
/**
* @var ContainerInterface
*/
private $locator;
/**
* @var Tasks
*/
private $tasksApi;
private $logger;
private $dispatcher;
public function __construct(EntityManagerInterface $em, ContainerInterface $locator, LoggerInterface $logger, Api $api, EventDispatcherInterface $dispatcher)
{
$this->em = $em;
$this->locator = $locator;
$this->tasksApi = $api->get(Tasks::class);
$this->logger = $logger;
$this->dispatcher = $dispatcher;
}
static function getSubscribedServices(): array
{
return [];
}
static function getSubscribedEvents(): array
{
return [
WorkerMessageFailedEvent::class => [
['handleFailed', 10]
]
];
}
public function handleFailed(WorkerMessageFailedEvent $event)
{
print_r($event->getReceiverName());
}
public function __invoke(CreateFixtureMessage $message)
{
$iterationNum = $message->getIterationNum();
$batchSize = $message->getBatchSize();
$campaign = $this->em->find(Campaign::class, $message->getCampaignId());
$campaignLinks = $campaign->getCampaignLinks();
$ccRepo = $this->em->getRepository(CampaignContact::class);
$sentCount = $ccRepo->countAllByUserId($campaign->getUser()->getId(), ['campaign' => 25]);
/** @var CampaignContact[] $result */
foreach ($ccRepo->iterateByCampaignId($campaign->getId(), $batchSize, $iterationNum * $batchSize) as $result) {
$cContact = $result[0];
$sendEvents = [];
$sendEvents[] = (new SendEvent())
->setCreatedAt(new \DateTime())
->setEvent('processed')
->setCampaignContact($cContact);
$sendEvents[] = (new SendEvent())
->setCreatedAt(new \DateTime())
->setEvent('delivered')
->setCampaignContact($cContact);
$randInt = random_int(0, 8);
switch ($randInt) {
case 0:
$sendEvents[] = (new SendEvent())
->setCreatedAt(new \DateTime())
->setEvent('bounced')
->setMessage('Spam bounced for testing')
->setCampaignContact($cContact);
break;
case 1:
$moreRand = random_int(1,5);
for ($i=0; $i<$moreRand; $i++) {
$sendEvents[] = (new SendEvent())
->setCreatedAt(new \DateTime())
->setEvent('opened')
->setMessage('Opened for testing')
->setCampaignContact($cContact);
$sendEvents[] = (new SendEvent())
->setCreatedAt(new \DateTime())
->setEvent('clicked')
->setCampaignContact($cContact);
$linkHit = new CampaignLinkHit();
$linkHit->setCampaignContact($cContact);
$oneOfTheLinks = $campaignLinks[random_int(0, count($campaignLinks))];
$linkHit->setCampaignLink($oneOfTheLinks);
$linkHit->setDateCreated(new \DateTime());
$this->em->persist($linkHit);
}
break;
}
foreach ($sendEvents as $sendEvent) {
$event = new CampaignContactUpdateEvent($sendEvent);
$this->dispatcher->dispatch($event, $event::NAME);
$sendEventResult = $event->getSendEvent();
$this->em->persist($sendEventResult);
}
$this->em->flush();
}
// Update task if there is one
if ($task = $this->em->find(Task::class, $message->getTaskId())) {
$this->tasksApi->increaseProgress($task);
}
}
}