src/MessageHandler/CreateFixtureHandler.php line 68

Open in your IDE?
  1. <?php
  2. namespace App\MessageHandler;
  3. use App\Entity\Campaign;
  4. use App\Entity\CampaignContact;
  5. use App\Entity\CampaignLinkHit;
  6. use App\Entity\Contact;
  7. use App\Entity\SendEvent;
  8. use App\Entity\Task;
  9. use App\Event\CampaignContactUpdateEvent;
  10. use App\Message\BatchSendCampaignMessage;
  11. use App\Message\CreateFixtureMessage;
  12. use App\Service\Api\Api;
  13. use App\Service\Api\Tasks;
  14. use App\Service\Campaign\CampaignEmailContact;
  15. use App\Service\Campaign\Sender\SenderInterface;
  16. use App\Service\Campaign\Sender\SendgridSender;
  17. use Doctrine\ORM\EntityManagerInterface;
  18. use Psr\Container\ContainerInterface;
  19. use Psr\Log\LoggerInterface;
  20. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  21. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  22. use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
  23. use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
  24. use Symfony\Contracts\Service\ServiceSubscriberInterface;
  25. class CreateFixtureHandler implements MessageHandlerInterface, ServiceSubscriberInterface, EventSubscriberInterface {
  26. /**
  27. * @var EntityManagerInterface
  28. */
  29. private $em;
  30. /**
  31. * @var ContainerInterface
  32. */
  33. private $locator;
  34. /**
  35. * @var Tasks
  36. */
  37. private $tasksApi;
  38. private $logger;
  39. private $dispatcher;
  40. public function __construct(EntityManagerInterface $em, ContainerInterface $locator, LoggerInterface $logger, Api $api, EventDispatcherInterface $dispatcher)
  41. {
  42. $this->em = $em;
  43. $this->locator = $locator;
  44. $this->tasksApi = $api->get(Tasks::class);
  45. $this->logger = $logger;
  46. $this->dispatcher = $dispatcher;
  47. }
  48. static function getSubscribedServices(): array
  49. {
  50. return [];
  51. }
  52. static function getSubscribedEvents(): array
  53. {
  54. return [
  55. WorkerMessageFailedEvent::class => [
  56. ['handleFailed', 10]
  57. ]
  58. ];
  59. }
  60. public function handleFailed(WorkerMessageFailedEvent $event)
  61. {
  62. print_r($event->getReceiverName());
  63. }
  64. public function __invoke(CreateFixtureMessage $message)
  65. {
  66. $iterationNum = $message->getIterationNum();
  67. $batchSize = $message->getBatchSize();
  68. $campaign = $this->em->find(Campaign::class, $message->getCampaignId());
  69. $campaignLinks = $campaign->getCampaignLinks();
  70. $ccRepo = $this->em->getRepository(CampaignContact::class);
  71. $sentCount = $ccRepo->countAllByUserId($campaign->getUser()->getId(), ['campaign' => 25]);
  72. /** @var CampaignContact[] $result */
  73. foreach ($ccRepo->iterateByCampaignId($campaign->getId(), $batchSize, $iterationNum * $batchSize) as $result) {
  74. $cContact = $result[0];
  75. $sendEvents = [];
  76. $sendEvents[] = (new SendEvent())
  77. ->setCreatedAt(new \DateTime())
  78. ->setEvent('processed')
  79. ->setCampaignContact($cContact);
  80. $sendEvents[] = (new SendEvent())
  81. ->setCreatedAt(new \DateTime())
  82. ->setEvent('delivered')
  83. ->setCampaignContact($cContact);
  84. $randInt = random_int(0, 8);
  85. switch ($randInt) {
  86. case 0:
  87. $sendEvents[] = (new SendEvent())
  88. ->setCreatedAt(new \DateTime())
  89. ->setEvent('bounced')
  90. ->setMessage('Spam bounced for testing')
  91. ->setCampaignContact($cContact);
  92. break;
  93. case 1:
  94. $moreRand = random_int(1,5);
  95. for ($i=0; $i<$moreRand; $i++) {
  96. $sendEvents[] = (new SendEvent())
  97. ->setCreatedAt(new \DateTime())
  98. ->setEvent('opened')
  99. ->setMessage('Opened for testing')
  100. ->setCampaignContact($cContact);
  101. $sendEvents[] = (new SendEvent())
  102. ->setCreatedAt(new \DateTime())
  103. ->setEvent('clicked')
  104. ->setCampaignContact($cContact);
  105. $linkHit = new CampaignLinkHit();
  106. $linkHit->setCampaignContact($cContact);
  107. $oneOfTheLinks = $campaignLinks[random_int(0, count($campaignLinks))];
  108. $linkHit->setCampaignLink($oneOfTheLinks);
  109. $linkHit->setDateCreated(new \DateTime());
  110. $this->em->persist($linkHit);
  111. }
  112. break;
  113. }
  114. foreach ($sendEvents as $sendEvent) {
  115. $event = new CampaignContactUpdateEvent($sendEvent);
  116. $this->dispatcher->dispatch($event, $event::NAME);
  117. $sendEventResult = $event->getSendEvent();
  118. $this->em->persist($sendEventResult);
  119. }
  120. $this->em->flush();
  121. }
  122. // Update task if there is one
  123. if ($task = $this->em->find(Task::class, $message->getTaskId())) {
  124. $this->tasksApi->increaseProgress($task);
  125. }
  126. }
  127. }