bundle/w3des/SmsBundle/src/EventSubscriber/NodeEventSubscriber.php line 27

Open in your IDE?
  1. <?php
  2. namespace w3des\SmsBundle\EventSubscriber;
  3. use Doctrine\Common\EventSubscriber;
  4. use Doctrine\ORM\Events;
  5. use Doctrine\ORM\Event\LifecycleEventArgs;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use w3des\AdminBundle\Entity\Node;
  8. use w3des\AdminBundle\Model\NodeView;
  9. use w3des\AdminBundle\Service\Nodes;
  10. use w3des\SmsBundle\Entity\SmsSubscribers;
  11. use Symfony\Contracts\Translation\TranslatorInterface;
  12. use Psr\Log\LoggerInterface;
  13. use Symfony\Component\Messenger\MessageBusInterface;
  14. use w3des\SmsBundle\Message\SendSmsMessage;
  15. class NodeEventSubscriber implements EventSubscriber
  16. {
  17. private Nodes $nodes;
  18. private EntityManagerInterface $em;
  19. private SmsService $sms;
  20. private TranslatorInterface $translator;
  21. private LoggerInterface $logger;
  22. public function __construct(
  23. Nodes $nodes,
  24. EntityManagerInterface $em,
  25. MessageBusInterface $bus,
  26. TranslatorInterface $translator,
  27. LoggerInterface $logger
  28. ) {
  29. $this->nodes = $nodes;
  30. $this->em = $em;
  31. $this->bus = $bus;
  32. $this->translator = $translator;
  33. $this->logger = $logger;
  34. }
  35. public function getSubscribedEvents(): array
  36. {
  37. return [
  38. Events::postPersist,
  39. ];
  40. }
  41. public function postPersist(LifecycleEventArgs $args): void
  42. {
  43. $entity = $args->getObject();
  44. if (!$entity instanceof Node) {
  45. return;
  46. }
  47. if ($entity->getType() !== 'failures') {
  48. return;
  49. }
  50. $nodeView = new NodeView($this->nodes, $entity);
  51. $nodeView->_fetch();
  52. if (!isset($nodeView->vars)) {
  53. return;
  54. }
  55. $vars = $nodeView->vars;
  56. $sendSms = $vars->has('send_sms') ? (bool) $vars->send_sms : false;
  57. $smsBody = $vars->has('sms_content') ? trim((string) $vars->sms_content) : null;
  58. $city = $vars->has('city') ? $vars->city : [];
  59. if (!$sendSms) {
  60. return;
  61. }
  62. if (!$smsBody) {
  63. $this->logger->warning('send_sms checked but sms_content empty', [
  64. 'node' => $entity->getId(),
  65. ]);
  66. return;
  67. }
  68. $cities = is_array($city) ? $city : [$city];
  69. $subscribers = $this->em
  70. ->getRepository(SmsSubscribers::class)
  71. ->createQueryBuilder('s')
  72. ->where('s.active = true')
  73. ->andWhere('s.city IN (:cities)')
  74. ->setParameter('cities', $cities)
  75. ->getQuery()
  76. ->getResult();
  77. if (!$subscribers) {
  78. return;
  79. }
  80. foreach ($subscribers as $subscriber) {
  81. $this->bus->dispatch(
  82. new SendSmsMessage(
  83. $subscriber->getPhone(),
  84. $smsBody,
  85. $entity->getId(),
  86. $cities
  87. )
  88. );
  89. }
  90. }
  91. }