src/EventSubscriber/Webhooks/AssetSubscriber.php line 34

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber\Webhooks;
  3. use App\Entity\AssetOnline;
  4. use App\Entity\VOD\Operator;
  5. use App\Entity\VOD\OperatorWebhook;
  6. use App\Entity\VOD\Title;
  7. use App\Entity\VOD\TitleMediaFormat;
  8. use App\Enum\PressSite\DomainLanguageEnum;
  9. use App\Event\VOD\WebhookEvent;
  10. use App\Service\Helper\Webhook\AssetOnlineTransformer;
  11. use DateTime;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Enqueue\Util\JSON;
  14. use Ramsey\Uuid\Uuid;
  15. class AssetSubscriber extends BaseWebhookSubscriber
  16. {
  17.     private $transformer;
  18.     /**
  19.      * @var AssetOnline
  20.      */
  21.     protected $entity;
  22.     public function __construct(EntityManagerInterface $entityManagerAssetOnlineTransformer $transformer)
  23.     {
  24.         parent::__construct($entityManager);
  25.         $this->transformer $transformer;
  26.     }
  27.     public function process(WebhookEvent $event): void
  28.     {
  29.         parent::process($event);
  30.         $operatorRepo $this->entityManager->getRepository(Operator::class);
  31.         if (!$this->entity instanceof AssetOnline) {
  32.             return;
  33.         }
  34.         $message = [];
  35.         $message['messageID'] = Uuid::uuid4()->toString();
  36.         $message['assetID'] = $this->entity->getAssetID();
  37.         $message['mediaIDs'] = $this->getMediaIds();
  38.         $message['formats'] = $this->getMediaFormats();
  39.         $message['eventName'] = $this->getEventName();
  40.         $message['timestamp'] = (new DateTime())->format(DateTime::ISO8601);
  41.         $message array_merge($message$this->transformer->transform($this->entity));
  42.         $message['topic'] = $this->getAssetType() . '-operation';
  43.         // Find operators that have access to entity.
  44.         $operators = [];
  45.         foreach ($this->entity->getAssociatedVodTitles() as $title) {
  46.             $operators array_merge($operators$operatorRepo->findEligibleOperatorsbyTitle($title));
  47.         }
  48.         // Remove operators with missing "asset image" contentType.
  49.         /* @var Operator $operator */
  50.         foreach ($operators as $key => $operator) {
  51.             if (($this->entity->isImageOrKeyArt() || $this->entity->isSubtitle())
  52.                 && !$operator->hasContentType($this->entity->getContentType())
  53.             ) {
  54.                 unset($operators[$key]);
  55.             }
  56.         }
  57.         switch ($this->event->getAction()) {
  58.             case 'create':
  59.                 $operators $this->filterOperatorsOnCreate($operators);
  60.                 break;
  61.             case 'update':
  62.                 $operators $this->filterOperatorsOnUpdate($operators);
  63.                 break;
  64.             case 'delete':
  65.                 $operators $this->filterOperatorsOnDelete($operators);
  66.                 // If the asset is removed from an operator there is no need to send data about the assets location or
  67.                 // properties.
  68.                 unset(
  69.                     $message['subTitleFile'],
  70.                     $message['imageUrl'],
  71.                     $message['size'],
  72.                 );
  73.                 break;
  74.             default:
  75.                 return;
  76.         }
  77.         $this->addToQueue($operators$message);
  78.         $event->stopPropagation();
  79.     }
  80.     protected function filterOperatorsOnCreate(array $operators): array
  81.     {
  82.         /** @var Operator $operator */
  83.         foreach ($operators as $index => $operator) {
  84.             if (!$this->operatorHasAssetLanguage($operator)) {
  85.                 unset($operators[$index]);
  86.             }
  87.         }
  88.         return $operators;
  89.     }
  90.     protected function filterOperatorsOnUpdate(array $operators): array
  91.     {
  92.         /** @var Operator $operator */
  93.         foreach ($operators as $index => $operator) {
  94.             if (!$this->operatorHasAssetLanguage($operator)) {
  95.                 unset($operators[$index]);
  96.             }
  97.         }
  98.         return $operators;
  99.     }
  100.     protected function filterOperatorsOnDelete(array $operators): array
  101.     {
  102.         /** @var Operator $operator */
  103.         foreach ($operators as $index => $operator) {
  104.             if (!$this->operatorHasAssetLanguage($operator)) {
  105.                 unset($operators[$index]);
  106.             }
  107.         }
  108.         return $operators;
  109.     }
  110.     private function operatorHasAssetLanguage(Operator $operator): bool
  111.     {
  112.         $has_eligible_languages false;
  113.         // Check if Operator has any of the languages, attached to the asset, assigned.
  114.         // Also, check if the country is enabled for export on the VOD Title.
  115.         $titles $this->entity->getAssociatedVodTitles();
  116.         foreach ($this->entity->getLanguages() as $language_name) {
  117.             $language array_search($language_name->__toString(), DomainLanguageEnum::readables(), true);
  118.             if ($language) {
  119.                 $country DomainLanguageEnum::getCountryByLanguage($language);
  120.                 /** @var Title $title */
  121.                 foreach ($titles as $title) {
  122.                     if ($operator->hasCountryByCode($country) && in_array(
  123.                         $country,
  124.                         $title->getAllApprovedCountriesForExport(),
  125.                         true
  126.                     )) {
  127.                         $has_eligible_languages true;
  128.                         $this->affected_countries[strtoupper($language)] = strtoupper($country);
  129.                     }
  130.                 }
  131.             }
  132.         }
  133.         return $has_eligible_languages;
  134.     }
  135.     protected function getMediaFormats(): array
  136.     {
  137.         $media_formats $this->entity->getAssociatedVodTitles()->map(fn(Title $title) => $title->getMediaFormats()->map(fn(TitleMediaFormat $format) => $format->getFormat())->toArray())->toArray();
  138.         if (!empty($media_formats)) {
  139.             return reset($media_formats);
  140.         }
  141.         return [];
  142.     }
  143.     protected function getMediaIds(): array
  144.     {
  145.         $media_ids $this->entity->getAssociatedVodTitles()->map(fn(Title $title) => $title->getMediaFormats()->map(fn(TitleMediaFormat $format) => $format->getId())->toArray())->toArray();
  146.         if (!empty($media_ids)) {
  147.             return reset($media_ids);
  148.         }
  149.         return [];
  150.     }
  151.     protected function getEventName(): string
  152.     {
  153.         return $this->getAssetType() . '-' $this->event->getAction() . 'd';
  154.     }
  155.     protected function getAssetType(): string
  156.     {
  157.         return ($this->entity->isImageOrKeyArt()) ? 'image' 'subtitle';
  158.     }
  159.     protected function addToQueue($operators$message): void
  160.     {
  161.         /** @var Operator $operator */
  162.         foreach ($operators as $operator) {
  163.             $personalized_message $this->personalizeMessage($operator$message);
  164.             /* @var OperatorWebhook $webhook */
  165.             foreach ($operator->getWebhooks() as $webhook) {
  166.                 if (in_array($message['topic'], $webhook->getTopics(), true)) {
  167.                     $personalized_message_json JSON::encode($personalized_message);
  168.                     if (empty($this->messagesSent[$operator->getId()][$personalized_message['messageID']])) {
  169.                         $this->messagesSent[$operator->getId()]
  170.                         [$personalized_message['messageID']] =
  171.                             $personalized_message_json;
  172.                         $now = (new \DateTime())->format('Y-m-d H:i:s');
  173.                         $sql "INSERT INTO `vod_operator_webhook_log`(`created_at`, `webhook_id`, `request_body`) 
  174.                         VALUES ('{$now}',{$webhook->getId()},'{$personalized_message_json}')";
  175.                         $this->entityManager->getConnection()->executeQuery($sql);
  176.                     }
  177.                 }
  178.             }
  179.         }
  180.     }
  181. }