src/EventListener/SendZapierPayloadListener.php line 86

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Harmonizely\EventListener;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use FOS\RestBundle\Context\Context;
  6. use FOS\RestBundle\Serializer\JMSSerializerAdapter;
  7. use FOS\RestBundle\Serializer\Serializer;
  8. use GuzzleHttp\ClientInterface;
  9. use GuzzleHttp\Exception\RequestException;
  10. use Harmonizely\Model\Event;
  11. use Harmonizely\Model\EventInterface;
  12. use Harmonizely\Model\EventType;
  13. use Harmonizely\Model\Integration;
  14. use Harmonizely\Model\IntegrationInterface;
  15. use Harmonizely\Model\Invitee;
  16. use Harmonizely\Model\UserInterface;
  17. use Harmonizely\Service\Subscription\Voter\SubscriptionVoter;
  18. use Harmonizely\Types\Company\EventTypeDurationType;
  19. use Harmonizely\Types\Company\IntegrationType;
  20. use Psr\Http\Message\ResponseInterface;
  21. use Psr\Log\LoggerInterface;
  22. use Symfony\Component\EventDispatcher\GenericEvent;
  23. use Webmozart\Assert\Assert;
  24. final class SendZapierPayloadListener
  25. {
  26.     /**
  27.      * @var ClientInterface
  28.      */
  29.     private $client;
  30.     /**
  31.      * @var EntityManagerInterface
  32.      */
  33.     private $entityManager;
  34.     /**
  35.      * @var Serializer
  36.      */
  37.     private $serializer;
  38.     /**
  39.      * @var LoggerInterface
  40.      */
  41.     private $logger;
  42.     public function __construct(
  43.         ClientInterface $client,
  44.         EntityManagerInterface $entityManager,
  45.         JMSSerializerAdapter $serializer,
  46.         LoggerInterface $logger
  47.     ) {
  48.         $this->client $client;
  49.         $this->entityManager $entityManager;
  50.         $this->serializer $serializer;
  51.         $this->logger $logger;
  52.     }
  53.     public function sendCreatedPayload(GenericEvent $event): void
  54.     {
  55.         $this->logger->notice('Start test ZAPIER log (create)');
  56.         $event $event->getSubject();
  57.         Assert::isInstanceOf($eventEventInterface::class);
  58.         $user $event->getUser();
  59.         if (!SubscriptionVoter::staticVoteOnAttribute(SubscriptionVoter::ZAPIER$user)) {
  60.             return;
  61.         }
  62.         $integration $this->findIntegration($user);
  63.         if ($integration && $integration->isEnabled()) {
  64.             $config $integration->getConfig();
  65.             if (!isset($config['createdWebhookUrl'])) {
  66.                 return;
  67.             }
  68.             $this->logger->notice('Send scheduled meeting payload to Zapier', [
  69.                 'user_email' => $user->getEmail(),
  70.                 'integration_config' => $integration->getConfig(),
  71.             ]);
  72.             $this->send($event$config['createdWebhookUrl']);
  73.         }
  74.     }
  75.     public function sendCancelledPayload(GenericEvent $event): void
  76.     {
  77.         $event $event->getSubject();
  78.         Assert::isInstanceOf($eventEventInterface::class);
  79.         $user $event->getUser();
  80.         if (!SubscriptionVoter::staticVoteOnAttribute(SubscriptionVoter::ZAPIER$user)) {
  81.             return;
  82.         }
  83.         $integration $this->findIntegration($user);
  84.         if ($integration && $integration->isEnabled()) {
  85.             $config $integration->getConfig();
  86.             if (!isset($config['canceledWebhookUrl'])) {
  87.                 return;
  88.             }
  89. //            $this->logger->notice('Send cancelled meeting payload to Zapier', [
  90. //                'user_email' => $user->getEmail(),
  91. //                'integration_config' => $integration->getConfig(),
  92. //            ]);
  93.             $this->send($event$config['canceledWebhookUrl']);
  94.         }
  95.     }
  96.     public function sendRescheduledPayload(GenericEvent $event): void
  97.     {
  98.         $event $event->getSubject();
  99.         Assert::isInstanceOf($eventEventInterface::class);
  100.         $user $event->getUser();
  101.         if (!SubscriptionVoter::staticVoteOnAttribute(SubscriptionVoter::ZAPIER$user)) {
  102.             return;
  103.         }
  104.         $integration $this->findIntegration($user);
  105.         if ($integration && $integration->isEnabled()) {
  106.             $config $integration->getConfig();
  107.             if (!isset($config['rescheduledWebhookUrl'])) {
  108.                 return;
  109.             }
  110.             $this->logger->notice('Send rescheduled meeting payload to Zapier', [
  111.                 'user_email' => $user->getEmail(),
  112.                 'integration_config' => $integration->getConfig(),
  113.             ]);
  114.             $this->send($event$config['rescheduledWebhookUrl']);
  115.         }
  116.     }
  117.     private function findIntegration(UserInterface $user): ?IntegrationInterface
  118.     {
  119.         $integrationRepository $this->entityManager->getRepository(Integration::class);
  120.         return $integrationRepository->findOneBy([
  121.             'type' => IntegrationType::TYPE_ZAPIER,
  122.             'user' => $user,
  123.             'enabled' => 1
  124.         ]);
  125.     }
  126.     public function sendCreatedTestPayload(GenericEvent $event): void
  127.     {
  128.         /** @var IntegrationInterface $integration */
  129.         $integration $event->getSubject();
  130.         Assert::isInstanceOf($integrationIntegrationInterface::class);
  131.         $config $integration->getConfig();
  132.         if (!isset($config['createdWebhookUrl'])) {
  133.             return;
  134.         }
  135.         $event $this->createTestEvent();
  136.         $this->send($event$config['createdWebhookUrl']);
  137.     }
  138.     public function sendCancelledTestPayload(GenericEvent $event): void
  139.     {
  140.         /** @var IntegrationInterface $integration */
  141.         $integration $event->getSubject();
  142.         Assert::isInstanceOf($integrationIntegrationInterface::class);
  143.         $config $integration->getConfig();
  144.         if (!isset($config['canceledWebhookUrl'])) {
  145.             return;
  146.         }
  147.         $event $this->createTestEvent();
  148.         $event->cancel();
  149.         $this->send($event$config['canceledWebhookUrl']);
  150.     }
  151.     public function sendRescheduledTestPayload(GenericEvent $event): void
  152.     {
  153.         /** @var IntegrationInterface $integration */
  154.         $integration $event->getSubject();
  155.         Assert::isInstanceOf($integrationIntegrationInterface::class);
  156.         $config $integration->getConfig();
  157.         if (!isset($config['rescheduledWebhookUrl'])) {
  158.             return;
  159.         }
  160.         $event $this->createTestEvent();
  161.         $this->send($event$config['rescheduledWebhookUrl']);
  162.     }
  163.     private function send(EventInterface $eventstring $webhookUrl): void
  164.     {
  165.         $context = new Context();
  166.         $context->setGroups(['integration']);
  167.         $context->setSerializeNull(true);
  168.         $payload $this->serializer->serialize($event'json'$context);
  169.         try {
  170.             $promise $this->client->postAsync($webhookUrl, [
  171.                 'body' => $payload,
  172.                 'headers' => [
  173.                     'Content-Type' => 'application/json',
  174.                     'User-Agent' => 'SimplyMeet.me',
  175.                 ],
  176.             ]);
  177.             $data json_decode($payloadtrue);
  178.             $inviteeData $data['invitee'];
  179.             $eventTypeData $data['event_type'];
  180.             unset($data['invitee'], $data['event_type']);
  181.             $this->logger->notice('Zapier data', [
  182.                 'content' => $data,
  183.                 'invitee' => $inviteeData,
  184.                 'event_type' => $eventTypeData,
  185.             ]);
  186.             $promise->then(
  187.                 function (ResponseInterface $res) {
  188.                     $this->logger->notice('Zapier response', [
  189.                         'status_code' => $res->getStatusCode(),
  190.                         'content' => $res->getBody()->getContents(),
  191.                     ]);
  192.                 },
  193.                 function (RequestException $e) {
  194.                     $this->logger->critical($e->getMessage());
  195.                 }
  196.             );
  197.             $promise->wait();
  198.         } catch (\Exception $e) {
  199.             $this->logger->critical($e->getMessage());
  200.         }
  201.     }
  202.     private function createTestEvent(): EventInterface
  203.     {
  204.         $event = new Event();
  205.         $eventType = new EventType();
  206.         $eventType->setDurationType(EventTypeDurationType::FIXED_TYPE);
  207.         $eventType->setName('15 min meeting');
  208.         $eventType->setLocation('Google Meet');
  209.         $eventType->setDescription('15 minutes meeting with me.');
  210.         $eventType->setDuration(15);
  211.         $eventType->setSlug('15min');
  212.         $eventType->setTimezone('Europe/Berlin');
  213.         $event->setEventType($eventType);
  214.         $event->setScheduledAt(new \DateTime('now'));
  215.         $event->setEndDate(new \DateTime('+1 hour'));
  216.         $event->setDuration(15);
  217.         $invitee = new Invitee();
  218.         $invitee->setTimezone('Europe/Berlin');
  219.         $invitee->setEmail('doe@example.com');
  220.         $invitee->setFullName('John Doe');
  221.         $invitee->setPhoneNumber(null);
  222.         $event->setInvitee($invitee);
  223.         return $event;
  224.     }
  225. }