src/MessageHandler/BatchSendCampaignHandler.php line 61

Open in your IDE?
  1. <?php
  2. namespace App\MessageHandler;
  3. use App\Entity\Contact;
  4. use App\Entity\Task;
  5. use App\Message\BatchSendCampaignMessage;
  6. use App\Service\Api\Api;
  7. use App\Service\Api\Tasks;
  8. use App\Service\Campaign\CampaignEmailContact;
  9. use App\Service\Campaign\Sender\SenderInterface;
  10. use App\Service\Campaign\Sender\SendgridSender;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Psr\Container\ContainerInterface;
  13. use Psr\Log\LoggerInterface;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\Messenger\Event\WorkerMessageFailedEvent;
  16. use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
  17. use Symfony\Contracts\Service\ServiceSubscriberInterface;
  18. class BatchSendCampaignHandler implements MessageHandlerInterface, ServiceSubscriberInterface, EventSubscriberInterface {
  19. /**
  20. * @var EntityManagerInterface
  21. */
  22. private $em;
  23. /**
  24. * @var ContainerInterface
  25. */
  26. private $locator;
  27. /**
  28. * @var Tasks
  29. */
  30. private $tasksApi;
  31. private $logger;
  32. public function __construct(EntityManagerInterface $em, ContainerInterface $locator, LoggerInterface $logger, Api $api)
  33. {
  34. $this->em = $em;
  35. $this->locator = $locator;
  36. $this->tasksApi = $api->get(Tasks::class);
  37. $this->logger = $logger;
  38. }
  39. static function getSubscribedServices(): array
  40. {
  41. return [
  42. SendgridSender::class
  43. ];
  44. }
  45. static function getSubscribedEvents(): array
  46. {
  47. return [
  48. WorkerMessageFailedEvent::class => [
  49. ['handleFailed', 10]
  50. ]
  51. ];
  52. }
  53. public function handleFailed(WorkerMessageFailedEvent $event)
  54. {
  55. print_r($event->getReceiverName());
  56. }
  57. public function __invoke(BatchSendCampaignMessage $message)
  58. {
  59. $campaignEmail = $message->getCampaignEmail();
  60. /** @var SenderInterface $sender */
  61. $sender = $this->locator->get($message->getSenderClass());
  62. $groups = $message->getGroups();
  63. $jsonRules = $message->getJsonRules();
  64. $iterationNum = $message->getIterationNum();
  65. $batchSize = $message->getBatchSize();
  66. // Get contacts batch
  67. $cCount = 0;
  68. $contactsRepo = $this->em->getRepository(Contact::class);
  69. /** @var Contact[] $result */
  70. foreach ($contactsRepo->iterateByQueryBuilder($groups, $jsonRules, $batchSize, $iterationNum * $batchSize) as $result) {
  71. $contact = $result[0];
  72. $campaignEmailContact = new CampaignEmailContact($contact->getEmail(), $contact->getId());
  73. $campaignEmail->addContact($campaignEmailContact);
  74. $cCount++;
  75. }
  76. $this->logger->debug('Campaign '.$campaignEmail->getCampaignId().' batch '.$iterationNum.': ' . json_encode([
  77. 'from' => $campaignEmail->getFrom(),
  78. 'from_address' => $campaignEmail->getFromAddress(),
  79. 'subject' => $campaignEmail->getSubject(),
  80. 'count' => $cCount
  81. ]));
  82. // Send batch
  83. $sender->sendCampaign($campaignEmail);
  84. // Update task if there is one
  85. if ($task = $this->em->find(Task::class, $message->getTaskId())) {
  86. $this->tasksApi->increaseProgress($task);
  87. }
  88. }
  89. }