<?php
namespace w3des\SmsBundle\EventSubscriber;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Events;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\EntityManagerInterface;
use w3des\AdminBundle\Entity\Node;
use w3des\AdminBundle\Model\NodeView;
use w3des\AdminBundle\Service\Nodes;
use w3des\SmsBundle\Entity\SmsSubscribers;
use Symfony\Contracts\Translation\TranslatorInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Messenger\MessageBusInterface;
use w3des\SmsBundle\Message\SendSmsMessage;
class NodeEventSubscriber implements EventSubscriber
{
private Nodes $nodes;
private EntityManagerInterface $em;
private SmsService $sms;
private TranslatorInterface $translator;
private LoggerInterface $logger;
public function __construct(
Nodes $nodes,
EntityManagerInterface $em,
MessageBusInterface $bus,
TranslatorInterface $translator,
LoggerInterface $logger
) {
$this->nodes = $nodes;
$this->em = $em;
$this->bus = $bus;
$this->translator = $translator;
$this->logger = $logger;
}
public function getSubscribedEvents(): array
{
return [
Events::postPersist,
];
}
public function postPersist(LifecycleEventArgs $args): void
{
$entity = $args->getObject();
if (!$entity instanceof Node) {
return;
}
if ($entity->getType() !== 'failures') {
return;
}
$nodeView = new NodeView($this->nodes, $entity);
$nodeView->_fetch();
if (!isset($nodeView->vars)) {
return;
}
$vars = $nodeView->vars;
$sendSms = $vars->has('send_sms') ? (bool) $vars->send_sms : false;
$smsBody = $vars->has('sms_content') ? trim((string) $vars->sms_content) : null;
$city = $vars->has('city') ? $vars->city : [];
if (!$sendSms) {
return;
}
if (!$smsBody) {
$this->logger->warning('send_sms checked but sms_content empty', [
'node' => $entity->getId(),
]);
return;
}
$cities = is_array($city) ? $city : [$city];
$subscribers = $this->em
->getRepository(SmsSubscribers::class)
->createQueryBuilder('s')
->where('s.active = true')
->andWhere('s.city IN (:cities)')
->setParameter('cities', $cities)
->getQuery()
->getResult();
if (!$subscribers) {
return;
}
foreach ($subscribers as $subscriber) {
$this->bus->dispatch(
new SendSmsMessage(
$subscriber->getPhone(),
$smsBody,
$entity->getId(),
$cities
)
);
}
}
}