vendor/ibexa/taxonomy/src/lib/Event/Subscriber/SynchronizeEntryWithContentSubscriber.php line 88

Open in your IDE?
  1. <?php
  2. /**
  3. * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4. * @license For full copyright and license information view LICENSE file distributed with this source code.
  5. */
  6. declare(strict_types=1);
  7. namespace Ibexa\Taxonomy\Event\Subscriber;
  8. use Ibexa\Contracts\Core\Repository\Events\Content\DeleteTranslationEvent;
  9. use Ibexa\Contracts\Core\Repository\Events\Content\PublishVersionEvent;
  10. use Ibexa\Contracts\Core\Repository\Events\Content\UpdateContentMetadataEvent;
  11. use Ibexa\Contracts\Core\Repository\Values\ContentType\ContentType;
  12. use Ibexa\Contracts\Taxonomy\Event\MoveTaxonomyEntryEvent;
  13. use Ibexa\Contracts\Taxonomy\Event\MoveTaxonomyEntryRelativeToSiblingEvent;
  14. use Ibexa\Contracts\Taxonomy\Service\TaxonomyServiceInterface;
  15. use Ibexa\Taxonomy\Exception\TaxonomyEntryNotFoundException;
  16. use Ibexa\Taxonomy\Repository\Content\ContentSynchronizerInterface;
  17. use Ibexa\Taxonomy\Service\TaxonomyConfiguration;
  18. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  19. /**
  20. * @internal
  21. */
  22. final class SynchronizeEntryWithContentSubscriber implements EventSubscriberInterface
  23. {
  24. private TaxonomyServiceInterface $taxonomyService;
  25. private TaxonomyConfiguration $taxonomyConfiguration;
  26. private ContentSynchronizerInterface $contentSynchronizer;
  27. public function __construct(
  28. TaxonomyServiceInterface $taxonomyService,
  29. TaxonomyConfiguration $taxonomyConfiguration,
  30. ContentSynchronizerInterface $contentSynchronizer
  31. ) {
  32. $this->taxonomyService = $taxonomyService;
  33. $this->taxonomyConfiguration = $taxonomyConfiguration;
  34. $this->contentSynchronizer = $contentSynchronizer;
  35. }
  36. public static function getSubscribedEvents(): array
  37. {
  38. return [
  39. PublishVersionEvent::class => 'onVersionPublish',
  40. DeleteTranslationEvent::class => 'onTranslationDelete',
  41. UpdateContentMetadataEvent::class => 'onContentMetadataUpdate',
  42. MoveTaxonomyEntryEvent::class => 'onTaxonomyEntryMove',
  43. MoveTaxonomyEntryRelativeToSiblingEvent::class => 'onMoveTaxonomyEntryRelativeToSibling',
  44. ];
  45. }
  46. /**
  47. * @throws \Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException
  48. * @throws \Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException
  49. */
  50. public function onVersionPublish(PublishVersionEvent $event): void
  51. {
  52. $content = $event->getContent();
  53. $this->doSynchronizeContent($content->getContentType(), $content->id);
  54. }
  55. /**
  56. * @throws \Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException
  57. * @throws \Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException
  58. */
  59. public function onTranslationDelete(DeleteTranslationEvent $event): void
  60. {
  61. $contentInfo = $event->getContentInfo();
  62. $this->doSynchronizeContent($contentInfo->getContentType(), $contentInfo->id);
  63. }
  64. /**
  65. * @throws \Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException
  66. * @throws \Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException
  67. */
  68. public function onContentMetadataUpdate(UpdateContentMetadataEvent $event): void
  69. {
  70. $content = $event->getContent();
  71. $this->doSynchronizeContent($content->getContentType(), $content->id);
  72. }
  73. public function onTaxonomyEntryMove(MoveTaxonomyEntryEvent $event): void
  74. {
  75. $content = $event->getTaxonomyEntry()->getContent();
  76. $this->doReverseSynchronizeContent($content->getContentType(), $content->id);
  77. }
  78. public function onMoveTaxonomyEntryRelativeToSibling(MoveTaxonomyEntryRelativeToSiblingEvent $event): void
  79. {
  80. $content = $event->getTaxonomyEntry()->getContent();
  81. $this->doReverseSynchronizeContent($content->getContentType(), $content->id);
  82. }
  83. /**
  84. * @throws \Ibexa\Contracts\Core\Repository\Exceptions\NotFoundException
  85. * @throws \Ibexa\Contracts\Core\Repository\Exceptions\UnauthorizedException
  86. */
  87. private function doSynchronizeContent(ContentType $contentType, int $contentId): void
  88. {
  89. if (!$this->taxonomyConfiguration->isContentTypeAssociatedWithTaxonomy($contentType)) {
  90. return;
  91. }
  92. try {
  93. $taxonomyEntry = $this->taxonomyService->loadEntryByContentId($contentId);
  94. } catch (TaxonomyEntryNotFoundException $e) {
  95. return;
  96. }
  97. $this->contentSynchronizer->synchronize($taxonomyEntry);
  98. }
  99. private function doReverseSynchronizeContent(ContentType $contentType, int $contentId): void
  100. {
  101. if (!$this->taxonomyConfiguration->isContentTypeAssociatedWithTaxonomy($contentType)) {
  102. return;
  103. }
  104. try {
  105. $taxonomyEntry = $this->taxonomyService->loadEntryByContentId($contentId);
  106. } catch (TaxonomyEntryNotFoundException $e) {
  107. return;
  108. }
  109. $this->contentSynchronizer->reverseSynchronize($taxonomyEntry);
  110. }
  111. }