custom/plugins/NewsletterSendinblue/src/Subscriber/CategorySubscriber.php line 117

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace NewsletterSendinblue\Subscriber;
  3. use Monolog\Logger;
  4. use NewsletterSendinblue\Message\Category\CategorySyncMessage;
  5. use NewsletterSendinblue\Service\BaseSyncService;
  6. use NewsletterSendinblue\Service\ConfigService;
  7. use NewsletterSendinblue\Service\Constant;
  8. use NewsletterSendinblue\Traits\HelperTrait;
  9. use Shopware\Core\Content\Category\CategoryEntity;
  10. use Shopware\Core\Content\Category\CategoryEvents;
  11. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  12. use Shopware\Core\Framework\DataAbstractionLayer\EntityWriteResult;
  13. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityDeletedEvent;
  14. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\Messenger\MessageBusInterface;
  17. class CategorySubscriber implements EventSubscriberInterface
  18. {
  19.     use HelperTrait;
  20.     /** @var BaseSyncService */
  21.     private $categorySyncService;
  22.     /** @var EntityRepositoryInterface */
  23.     private $systemConfigRepository;
  24.     /** @var ConfigService */
  25.     private $configService;
  26.     /** @var Logger */
  27.     private $logger;
  28.     /** @var MessageBusInterface */
  29.     private $messageBus;
  30.     /**
  31.      * @param BaseSyncService $categorySyncService
  32.      * @param EntityRepositoryInterface $systemConfigRepository
  33.      * @param ConfigService $configService
  34.      * @param Logger $logger
  35.      * @param MessageBusInterface $messageBus
  36.      */
  37.     public function __construct(
  38.         BaseSyncService           $categorySyncService,
  39.         EntityRepositoryInterface $systemConfigRepository,
  40.         ConfigService             $configService,
  41.         Logger                    $logger,
  42.         MessageBusInterface       $messageBus
  43.     )
  44.     {
  45.         $this->categorySyncService $categorySyncService;
  46.         $this->systemConfigRepository $systemConfigRepository;
  47.         $this->configService $configService;
  48.         $this->logger $logger;
  49.         $this->messageBus $messageBus;
  50.     }
  51.     /**
  52.      * @return string[]
  53.      */
  54.     public static function getSubscribedEvents()
  55.     {
  56.         return [
  57.             CategoryEvents::CATEGORY_TRANSLATION_WRITTEN_EVENT => 'onCategoryWrittenEvent',
  58.             CategoryEvents::CATEGORY_DELETED_EVENT => 'onCategoryDeletedEvent',
  59.         ];
  60.     }
  61.     /**
  62.      * @param EntityDeletedEvent $event
  63.      * @return void
  64.      */
  65.     public function onCategoryDeletedEvent(EntityDeletedEvent $event): void
  66.     {
  67.         $connectionId $this->getAutoSyncConnectionId(
  68.             ConfigService::CONFIG_IS_CATEGORY_AUTO_SYNC_ENABLED,
  69.             $event->getContext()
  70.         );
  71.         if (empty($connectionId)) {
  72.             return;
  73.         }
  74.         foreach ($event->getWriteResults() as $writeResult) {
  75.             $categoryId $writeResult->getPrimaryKey();
  76.             if (empty($categoryId)) {
  77.                 continue;
  78.             }
  79.             $deleteCategories $event->getContext()->hasExtension('brevoPreWriteEvent')
  80.                 ? $event->getContext()->getExtension('brevoPreWriteEvent')->get('deleteCategories')
  81.                 : null;
  82.             if ($writeResult->getOperation() === EntityWriteResult::OPERATION_DELETE
  83.                 && !empty($deleteCategories)
  84.                 && isset($deleteCategories[$categoryId])
  85.                 && $deleteCategories[$categoryId] instanceof CategoryEntity
  86.             ) {
  87.                 foreach ($deleteCategories as $deleteCategory) {
  88.                     if ($deleteCategory instanceof CategoryEntity) {
  89.                         $this->categorySyncService->syncDelete($deleteCategory$connectionId$event->getContext());
  90.                     }
  91.                 }
  92.                 $event->getContext()->getExtension('brevoPreWriteEvent')->set('deleteCategories', []);
  93.                 $this->categorySyncService->setDeleteEntities([]);
  94.                 break;
  95.             }
  96.         }
  97.     }
  98.     /**
  99.      * @param EntityWrittenEvent $event
  100.      * @return void
  101.      */
  102.     public function onCategoryWrittenEvent(EntityWrittenEvent $event): void
  103.     {
  104.         $connectionId $this->getAutoSyncConnectionId(
  105.             ConfigService::CONFIG_IS_CATEGORY_AUTO_SYNC_ENABLED,
  106.             $event->getContext()
  107.         );
  108.         if (empty($connectionId)) {
  109.             return;
  110.         }
  111.         $writeResultsCount count($event->getWriteResults());
  112.         foreach ($event->getWriteResults() as $writeResult) {
  113.             $categoryId $writeResult->getPrimaryKey()['categoryId'];
  114.             if (empty($categoryId)) {
  115.                 continue;
  116.             }
  117.             // it is for avoiding call "sync" action when custom field is saved
  118.             if (!$this->checkChangeSet($writeResult)) {
  119.                 continue;
  120.             }
  121.             if ($writeResult->getOperation() !== EntityWriteResult::OPERATION_DELETE) {
  122.                 /** @var CategoryEntity $category */
  123.                 $category $this->categorySyncService->getEntity($categoryId$event->getContext());
  124.                 // Async processing
  125.                 if ($writeResultsCount >= Constant::ASYNC_THRESHOLD) {
  126.                     $this->messageBus->dispatch(new CategorySyncMessage(
  127.                         $categoryId,
  128.                         $connectionId,
  129.                         $writeResult->getOperation(),
  130.                         !$category->getActive(),
  131.                         $event->getContext(),
  132.                         !$category->getActive()
  133.                     ));
  134.                 } else { // Sync processing
  135.                     if (!$category->getActive()) {
  136.                         $this->categorySyncService->syncDelete($category$connectionId$event->getContext(), true);
  137.                     } else {
  138.                         $this->categorySyncService->sync($categoryId$connectionId$event->getContext());
  139.                     }
  140.                 }
  141.             }
  142.         }
  143.     }
  144. }