From dbb447a90d5c4d4918ef3563afefab001b749773 Mon Sep 17 00:00:00 2001 From: Ben Walch Date: Wed, 31 Jul 2024 16:01:23 +0200 Subject: [PATCH 1/3] fix resource deletion --- .../MessageHandler/QueuedResourcesHandler.php | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Queue/MessageHandler/QueuedResourcesHandler.php b/src/Queue/MessageHandler/QueuedResourcesHandler.php index 01b280e..e066dcf 100644 --- a/src/Queue/MessageHandler/QueuedResourcesHandler.php +++ b/src/Queue/MessageHandler/QueuedResourcesHandler.php @@ -3,11 +3,15 @@ namespace DynamicSearchBundle\Queue\MessageHandler; use DynamicSearchBundle\Builder\ContextDefinitionBuilderInterface; +use DynamicSearchBundle\Context\ContextDefinitionInterface; use DynamicSearchBundle\Logger\LoggerInterface; use DynamicSearchBundle\Normalizer\Resource\NormalizedDataResourceInterface; use DynamicSearchBundle\Processor\Harmonizer\ResourceHarmonizerInterface; use DynamicSearchBundle\Queue\Message\ProcessResourceMessage; use DynamicSearchBundle\Queue\Message\QueueResourceMessage; +use Pimcore\Model\Asset; +use Pimcore\Model\DataObject; +use Pimcore\Model\Document; use Pimcore\Model\Element; use Symfony\Component\Messenger\Handler\Acknowledger; use Symfony\Component\Messenger\Handler\BatchHandlerInterface; @@ -44,9 +48,20 @@ private function process(array $jobs): void $resource = $message->resource; if (str_contains($message->resourceType, '-')) { [$type, $id] = explode('-', $message->resourceType); + if (is_numeric($id)) { + $id = (int) $id; + } $resource = Element\Service::getElementById($type, $id); - if (!$resource instanceof Element\ElementInterface) { - continue; + if (null === $resource && $message->dispatchType === ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_DELETE) { + // at this time, the resource is already deleted by pimcore + // since we do not serialize the resource into the message, + // we need to create a dummy resource to retrieve a valid resource meta for deletion + $resource = match ($type) { + 'document' => new Document(), + 'asset' => new Asset(), + 'object' => new DataObject\Concrete(), + }; + $resource->setId($id); } } From 4dac255b3ce69d2abce7eeec0adc5300c3dba99b Mon Sep 17 00:00:00 2001 From: Ben Walch Date: Wed, 31 Jul 2024 16:09:00 +0200 Subject: [PATCH 2/3] add upgrade note --- UPGRADE.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/UPGRADE.md b/UPGRADE.md index d9cc1ac..3b338e9 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -1,5 +1,9 @@ # Upgrade Notes +# 4.0.1 + +* fix resource deletion [#90](https://github.com/dachcom-digital/pimcore-dynamic-search/pull/90) + ## Migrating from Version 3.x to Version 4.x ### Breaking Changes From 4d4af0d5384cf19feb4d9b6f77fa6b4bf24c7a61 Mon Sep 17 00:00:00 2001 From: DDEV User Date: Mon, 5 Aug 2024 10:00:56 +0200 Subject: [PATCH 3/3] deprecations / comments --- src/EventListener/PimcoreElementListener.php | 2 ++ src/Queue/DataCollector.php | 4 ++-- src/Queue/MessageHandler/QueuedResourcesHandler.php | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/EventListener/PimcoreElementListener.php b/src/EventListener/PimcoreElementListener.php index ac7ac89..f6e9b76 100644 --- a/src/EventListener/PimcoreElementListener.php +++ b/src/EventListener/PimcoreElementListener.php @@ -99,6 +99,7 @@ public function onObjectPostUpdate(DataObjectEvent $event): void /** @var DataObject\Concrete $object */ $object = $event->getObject(); + // @deprecated since 5.0: published/unpublished must be handled by project-specific resource validation $dispatchType = ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_UPDATE; if (method_exists($object, 'isPublished') && $object->isPublished() === false) { $dispatchType = ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_DELETE; @@ -199,6 +200,7 @@ protected function checkInheritanceIndex(ElementInterface $element): void foreach ($list->getObjects() as $childObject) { $dispatchType = ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_UPDATE; + // @deprecated since 5.0: published/unpublished must be handled by project-specific resource validation if (method_exists($childObject, 'isPublished') && $childObject->isPublished() === false) { $dispatchType = ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_DELETE; } diff --git a/src/Queue/DataCollector.php b/src/Queue/DataCollector.php index c44e277..2038a5d 100644 --- a/src/Queue/DataCollector.php +++ b/src/Queue/DataCollector.php @@ -96,8 +96,8 @@ public function addToContextQueue(string $contextName, string $dispatchType, mix protected function generateJob(string $contextName, string $dispatchType, mixed $resource, array $options): void { - - if($resource instanceof ElementInterface) { + // @todo: introduce generic "resource info" dto with resource information + if ($resource instanceof ElementInterface) { $resourceType = sprintf('%s-%s', Element\Service::getElementType($resource), $resource->getId()); $resource = null; } elseif (is_object($resource)) { diff --git a/src/Queue/MessageHandler/QueuedResourcesHandler.php b/src/Queue/MessageHandler/QueuedResourcesHandler.php index e066dcf..80b7672 100644 --- a/src/Queue/MessageHandler/QueuedResourcesHandler.php +++ b/src/Queue/MessageHandler/QueuedResourcesHandler.php @@ -46,13 +46,14 @@ private function process(array $jobs): void try { $resource = $message->resource; + // @todo: use introduced "resource info" dto to determinate resource / type if (str_contains($message->resourceType, '-')) { [$type, $id] = explode('-', $message->resourceType); if (is_numeric($id)) { $id = (int) $id; } $resource = Element\Service::getElementById($type, $id); - if (null === $resource && $message->dispatchType === ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_DELETE) { + if ($resource === null && $message->dispatchType === ContextDefinitionInterface::CONTEXT_DISPATCH_TYPE_DELETE) { // at this time, the resource is already deleted by pimcore // since we do not serialize the resource into the message, // we need to create a dummy resource to retrieve a valid resource meta for deletion