<?php
namespace Abcpremium\DataObjectQualityBundle\Event\Subscriber;
use Abcpremium\DataObjectQualityBundle\Cache\BundleCache;
use Abcpremium\DataObjectQualityBundle\Configuration\BundleConfiguration;
use Abcpremium\DataObjectQualityBundle\Messenger\Message\UpdateDataQualityAsyncMessage;
use Abcpremium\DataObjectQualityBundle\Messenger\Message\UpdateDataQualityMessage;
use Abcpremium\DataObjectQualityBundle\Model\DataQuality\DataQualityService;
use Pimcore\Event\DataObjectEvents;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Model\DataObject\Concrete;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Messenger\MessageBusInterface;
class HandleObjectSave implements EventSubscriberInterface
{
private BundleConfiguration $bundleConfiguration;
private MessageBusInterface $messageBus;
private BundleCache $cache;
public function __construct(
BundleCache $cache,
BundleConfiguration $bundleConfiguration,
MessageBusInterface $messageBus
) {
$this->bundleConfiguration = $bundleConfiguration;
$this->messageBus = $messageBus;
$this->cache = $cache;
}
/**
* {@inheritDoc}
*/
public static function getSubscribedEvents(): array
{
return [
DataObjectEvents::POST_UPDATE => 'setDataQualityOfObject',
];
}
public function setDataQualityOfObject(DataObjectEvent $dataObjectEvent): void
{
if (true === $this->isAutoSave($dataObjectEvent->getArguments())) {
return;
}
$element = $dataObjectEvent->getElement();
if (!$element instanceof Concrete) {
return;
}
$this->cache->deleteResultFromCache($element);
$dataQualityPropertyName = $this->bundleConfiguration->getPropertyNameForDataQuality($element->getClassId());
if (null === $dataQualityPropertyName) {
return;
}
$this->dispatchUpdateMessage($element, $dataQualityPropertyName);
}
private function isAutoSave(array $eventArguments): bool
{
if (isset($eventArguments['isAutoSave']) && true === $eventArguments['isAutoSave']) {
return true;
}
return false;
}
private function dispatchUpdateMessage(Concrete $element, string $dataQualityPropertyName): void
{
if (true === $this->bundleConfiguration->isCalculationOnSaveDoneAsync()) {
$updateMessage = new UpdateDataQualityAsyncMessage($element->getId(), $dataQualityPropertyName);
} else {
$updateMessage = new UpdateDataQualityMessage($element->getId(), $dataQualityPropertyName);
}
$this->messageBus->dispatch($updateMessage);
}
}