From 0aed42752ed51ab024ce6087d17be69d358b54c9 Mon Sep 17 00:00:00 2001 From: Martin Eiber Date: Wed, 24 Jan 2024 14:50:45 +0100 Subject: [PATCH] PD-105 Add Events (#2) * PD-105 Add Asset ExtractMappingEvent. * PD-105 Add UpdateIndexDataEvent for DataObjects and Assets. * PD-105 Add ExtractMappingEvent DataObjects. * Apply php-cs-fixer changes * PD-105 Use namespace for exception. --------- Co-authored-by: martineiber --- src/Event/Asset/ExtractMappingEvent.php | 43 +++++++++++++++ src/Event/Asset/UpdateIndexDataEvent.php | 53 +++++++++++++++++++ src/Event/DataObject/ExtractMappingEvent.php | 52 ++++++++++++++++++ src/Event/DataObject/UpdateIndexDataEvent.php | 53 +++++++++++++++++++ src/Event/UpdateIndexDataEventInterface.php | 25 +++++++++ .../AbstractElementTypeAdapter.php | 6 +++ .../ElementTypeAdapter/AssetTypeAdapter.php | 14 +++++ .../DataObjectTypeAdapter.php | 14 +++++ .../IndexHandler/AbstractIndexHandler.php | 2 + .../IndexHandler/AssetIndexHandler.php | 16 ++++-- .../IndexHandler/DataObjectIndexHandler.php | 17 ++++-- .../SearchIndex/IndexService/IndexService.php | 12 +++-- 12 files changed, 295 insertions(+), 12 deletions(-) create mode 100644 src/Event/Asset/ExtractMappingEvent.php create mode 100644 src/Event/Asset/UpdateIndexDataEvent.php create mode 100644 src/Event/DataObject/ExtractMappingEvent.php create mode 100644 src/Event/DataObject/UpdateIndexDataEvent.php create mode 100644 src/Event/UpdateIndexDataEventInterface.php diff --git a/src/Event/Asset/ExtractMappingEvent.php b/src/Event/Asset/ExtractMappingEvent.php new file mode 100644 index 00000000..2beed2d0 --- /dev/null +++ b/src/Event/Asset/ExtractMappingEvent.php @@ -0,0 +1,43 @@ +customFieldsMapping = $customFieldsMapping; + } + + public function getCustomFieldsMapping(): array + { + return $this->customFieldsMapping; + } + + public function setCustomFieldsMapping(array $customFieldsMapping): self + { + $this->customFieldsMapping = $customFieldsMapping; + + return $this; + } +} diff --git a/src/Event/Asset/UpdateIndexDataEvent.php b/src/Event/Asset/UpdateIndexDataEvent.php new file mode 100644 index 00000000..d54796bb --- /dev/null +++ b/src/Event/Asset/UpdateIndexDataEvent.php @@ -0,0 +1,53 @@ +asset = $asset; + $this->customFields = $customFields; + } + + public function getElement(): Asset + { + return $this->asset; + } + + public function getCustomFields(): array + { + return $this->customFields; + } + + public function setCustomFields(array $customFields): self + { + $this->customFields = $customFields; + + return $this; + } +} diff --git a/src/Event/DataObject/ExtractMappingEvent.php b/src/Event/DataObject/ExtractMappingEvent.php new file mode 100644 index 00000000..6cd86b4f --- /dev/null +++ b/src/Event/DataObject/ExtractMappingEvent.php @@ -0,0 +1,52 @@ +classDefinition = $classDefinition; + $this->customFieldsMapping = $customFieldsMapping; + } + + public function getClassDefinition(): ClassDefinition + { + return $this->classDefinition; + } + + public function getCustomFieldsMapping(): array + { + return $this->customFieldsMapping; + } + + public function setCustomFieldsMapping(array $customFieldsMapping): self + { + $this->customFieldsMapping = $customFieldsMapping; + + return $this; + } +} diff --git a/src/Event/DataObject/UpdateIndexDataEvent.php b/src/Event/DataObject/UpdateIndexDataEvent.php new file mode 100644 index 00000000..254dee75 --- /dev/null +++ b/src/Event/DataObject/UpdateIndexDataEvent.php @@ -0,0 +1,53 @@ +dataObject = $dataObject; + $this->customFields = $customFields; + } + + public function getElement(): Concrete + { + return $this->dataObject; + } + + public function getCustomFields(): array + { + return $this->customFields; + } + + public function setCustomFields(array $customFields): self + { + $this->customFields = $customFields; + + return $this; + } +} diff --git a/src/Event/UpdateIndexDataEventInterface.php b/src/Event/UpdateIndexDataEventInterface.php new file mode 100644 index 00000000..b6cadcb9 --- /dev/null +++ b/src/Event/UpdateIndexDataEventInterface.php @@ -0,0 +1,25 @@ +normalizer; } + + public function getUpdateIndexDataEvent( + ElementInterface $element, + array $customFields + ): UpdateIndexDataEventInterface { + if(!$element instanceof Asset) { + throw new InvalidArgumentException('Element must be of type Asset'); + } + + return new UpdateIndexDataEvent($element, $customFields); + } } diff --git a/src/Service/SearchIndex/IndexService/ElementTypeAdapter/DataObjectTypeAdapter.php b/src/Service/SearchIndex/IndexService/ElementTypeAdapter/DataObjectTypeAdapter.php index 1f79f893..7d76d599 100644 --- a/src/Service/SearchIndex/IndexService/ElementTypeAdapter/DataObjectTypeAdapter.php +++ b/src/Service/SearchIndex/IndexService/ElementTypeAdapter/DataObjectTypeAdapter.php @@ -15,7 +15,10 @@ use Doctrine\DBAL\Connection; use Doctrine\DBAL\Query\QueryBuilder; +use InvalidArgumentException; use Pimcore\Bundle\GenericDataIndexBundle\Enum\SearchIndex\ElementType; +use Pimcore\Bundle\GenericDataIndexBundle\Event\DataObject\UpdateIndexDataEvent; +use Pimcore\Bundle\GenericDataIndexBundle\Event\UpdateIndexDataEventInterface; use Pimcore\Bundle\GenericDataIndexBundle\Service\Normalizer\DataObjectNormalizer; use Pimcore\Model\DataObject\AbstractObject; use Pimcore\Model\DataObject\ClassDefinition; @@ -117,4 +120,15 @@ public function getRelatedItemsOnUpdateQuery( return $select; } + + public function getUpdateIndexDataEvent( + ElementInterface $element, + array $customFields + ): UpdateIndexDataEventInterface { + if (!$element instanceof Concrete) { + throw new InvalidArgumentException('Element must be instance of ' . Concrete::class); + } + + return new UpdateIndexDataEvent($element, $customFields); + } } diff --git a/src/Service/SearchIndex/IndexService/IndexHandler/AbstractIndexHandler.php b/src/Service/SearchIndex/IndexService/IndexHandler/AbstractIndexHandler.php index 05915048..7d4f1798 100644 --- a/src/Service/SearchIndex/IndexService/IndexHandler/AbstractIndexHandler.php +++ b/src/Service/SearchIndex/IndexService/IndexHandler/AbstractIndexHandler.php @@ -17,6 +17,7 @@ use Pimcore\Bundle\GenericDataIndexBundle\Service\SearchIndex\OpenSearch\OpenSearchService; use Pimcore\Bundle\GenericDataIndexBundle\Service\SearchIndex\SearchIndexConfigService; use Pimcore\Bundle\GenericDataIndexBundle\Traits\LoggerAwareTrait; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; abstract class AbstractIndexHandler implements IndexHandlerInterface { @@ -25,6 +26,7 @@ abstract class AbstractIndexHandler implements IndexHandlerInterface public function __construct( protected readonly OpenSearchService $openSearchService, protected readonly SearchIndexConfigService $searchIndexConfigService, + protected readonly EventDispatcherInterface $eventDispatcher ) { } diff --git a/src/Service/SearchIndex/IndexService/IndexHandler/AssetIndexHandler.php b/src/Service/SearchIndex/IndexService/IndexHandler/AssetIndexHandler.php index 3ed9d3a1..b1eabaac 100644 --- a/src/Service/SearchIndex/IndexService/IndexHandler/AssetIndexHandler.php +++ b/src/Service/SearchIndex/IndexService/IndexHandler/AssetIndexHandler.php @@ -14,6 +14,7 @@ namespace Pimcore\Bundle\GenericDataIndexBundle\Service\SearchIndex\IndexService\IndexHandler; use Pimcore\Bundle\GenericDataIndexBundle\Enum\SearchIndex\FieldCategory; +use Pimcore\Bundle\GenericDataIndexBundle\Event\Asset\ExtractMappingEvent; use Pimcore\Bundle\GenericDataIndexBundle\Service\SearchIndex\IndexService\ElementTypeAdapter\AssetTypeAdapter; use Pimcore\Bundle\GenericDataIndexBundle\Service\SearchIndex\SearchIndexConfigService; use Symfony\Contracts\Service\Attribute\Required; @@ -32,10 +33,9 @@ protected function extractMappingProperties(mixed $context = null): array FieldCategory::STANDARD_FIELDS->value => [], FieldCategory::CUSTOM_FIELDS->value => [], ]; - //$extractMappingEvent = new ExtractMappingEvent($mappingProperties[FieldCategory::CUSTOM_FIELDS->value]); - //$this->eventDispatcher->dispatch($extractMappingEvent); - //$mappingProperties[FieldCategory::CUSTOM_FIELDS->value]['properties'] = - // $extractMappingEvent->getCustomFieldsMapping(); + + $mappingProperties[FieldCategory::CUSTOM_FIELDS->value]['properties'] = + $this->fireEventAndGetCustomFieldsMapping($mappingProperties[FieldCategory::CUSTOM_FIELDS->value]); return $mappingProperties; } @@ -50,4 +50,12 @@ public function setAssetAdapter(AssetTypeAdapter $assetAdapter): void { $this->assetAdapter = $assetAdapter; } + + private function fireEventAndGetCustomFieldsMapping($customFields): array + { + $extractMappingEvent = new ExtractMappingEvent($customFields); + $this->eventDispatcher->dispatch($extractMappingEvent); + + return $extractMappingEvent->getCustomFieldsMapping(); + } } diff --git a/src/Service/SearchIndex/IndexService/IndexHandler/DataObjectIndexHandler.php b/src/Service/SearchIndex/IndexService/IndexHandler/DataObjectIndexHandler.php index 31894324..612c2827 100644 --- a/src/Service/SearchIndex/IndexService/IndexHandler/DataObjectIndexHandler.php +++ b/src/Service/SearchIndex/IndexService/IndexHandler/DataObjectIndexHandler.php @@ -14,6 +14,7 @@ namespace Pimcore\Bundle\GenericDataIndexBundle\Service\SearchIndex\IndexService\IndexHandler; use Pimcore\Bundle\GenericDataIndexBundle\Enum\SearchIndex\FieldCategory; +use Pimcore\Bundle\GenericDataIndexBundle\Event\DataObject\ExtractMappingEvent; use Pimcore\Bundle\GenericDataIndexBundle\Service\SearchIndex\DataObject\FieldDefinitionService; use Pimcore\Bundle\GenericDataIndexBundle\Service\SearchIndex\IndexService\ElementTypeAdapter\DataObjectTypeAdapter; use Pimcore\Bundle\GenericDataIndexBundle\Service\SearchIndex\SearchIndexConfigService; @@ -77,9 +78,11 @@ private function extractMappingByClassDefinition(ClassDefinition $classDefinitio } } - //$extractMappingEvent = new ExtractMappingEvent($classDefinition, $mappingProperties[FieldCategory::CUSTOM_FIELDS->value]); - //$this->eventDispatcher->dispatch($extractMappingEvent); - //$mappingProperties[FieldCategory::CUSTOM_FIELDS->value]['properties'] = $extractMappingEvent->getCustomFieldsMapping(); + $mappingProperties[FieldCategory::CUSTOM_FIELDS->value]['properties'] = + $this->fireEventAndGetCustomFieldsMapping( + $classDefinition, + $mappingProperties[FieldCategory::CUSTOM_FIELDS->value] + ); return $mappingProperties; } @@ -95,4 +98,12 @@ public function setDataObjectTypeAdapter(DataObjectTypeAdapter $dataObjectTypeAd { $this->dataObjectTypeAdapter = $dataObjectTypeAdapter; } + + public function fireEventAndGetCustomFieldsMapping(ClassDefinition $classDefinition, array $customFields): array + { + $extractMappingEvent = new ExtractMappingEvent($classDefinition, $customFields); + $this->eventDispatcher->dispatch($extractMappingEvent); + + return $extractMappingEvent->getCustomFieldsMapping(); + } } diff --git a/src/Service/SearchIndex/IndexService/IndexService.php b/src/Service/SearchIndex/IndexService/IndexService.php index d4c26294..6237932f 100644 --- a/src/Service/SearchIndex/IndexService/IndexService.php +++ b/src/Service/SearchIndex/IndexService/IndexService.php @@ -24,6 +24,7 @@ use Pimcore\Bundle\GenericDataIndexBundle\Traits\LoggerAwareTrait; use Pimcore\Model\Element\ElementInterface; use Symfony\Component\Serializer\Exception\ExceptionInterface; +use Symfony\Contracts\EventDispatcher\EventDispatcherInterface; class IndexService implements IndexServiceInterface { @@ -35,6 +36,7 @@ public function __construct( protected readonly ElementTypeAdapterService $typeAdapterService, protected readonly OpenSearchService $openSearchService, protected readonly BulkOperationService $bulkOperationService, + protected readonly EventDispatcherInterface $eventDispatcher ) { } @@ -109,8 +111,8 @@ public function deleteFromIndex(ElementInterface $element): IndexService */ private function getIndexData(ElementInterface $element): array { - $indexData = $this->typeAdapterService - ->getTypeAdapter($element) + $typeAdapter = $this->typeAdapterService->getTypeAdapter($element); + $indexData = $typeAdapter ->getNormalizer() ->normalize($element); @@ -119,9 +121,9 @@ private function getIndexData(ElementInterface $element): array $customFields = []; //dispatch event before building checksum - //$updateIndexDataEvent = new UpdateIndexDataEvent($dataObject, $customFields); - //$this->eventDispatcher->dispatch($updateIndexDataEvent); - //$customFields = $updateIndexDataEvent->getCustomFields(); + $updateIndexDataEvent = $typeAdapter->getUpdateIndexDataEvent($element, $customFields); + $this->eventDispatcher->dispatch($updateIndexDataEvent); + $customFields = $updateIndexDataEvent->getCustomFields(); $checksum = crc32(json_encode([$systemFields, $standardFields, $customFields], JSON_THROW_ON_ERROR)); $systemFields[SystemField::CHECKSUM->value] = $checksum;