<?php declare(strict_types=1);
namespace Neon\Configurator\Subscribers;
use Doctrine\DBAL\Connection;
use Neon\Configurator\Core\Content\Configuration\ConfigurationDefinition;
use Shopware\Core\Content\Product\Aggregate\ProductCategory\ProductCategoryDefinition;
use Shopware\Core\Content\Product\SalesChannel\Detail\CachedProductDetailRoute;
use Shopware\Core\Defaults;
use Shopware\Core\Framework\Adapter\Cache\CacheInvalidator;
use Shopware\Core\Framework\DataAbstractionLayer\Cache\EntityCacheKeyGenerator;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenContainerEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
use Shopware\Core\Framework\Uuid\Uuid;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* @internal - The functions inside this class are no public-api and can be changed without previous deprecation
*/
class CacheInvalidatorSubscriber implements EventSubscriberInterface
{
private Connection $connection;
private CacheInvalidator $cacheInvalidator;
public function __construct(
CacheInvalidator $cacheInvalidator,
Connection $connection
)
{
$this->cacheInvalidator = $cacheInvalidator;
$this->connection = $connection;
}
public static function getSubscribedEvents()
{
return [
EntityWrittenContainerEvent::class => [
['invalidateProductConfigurationAssignment', 2006]
],
];
}
public function invalidateProductConfigurationAssignment(EntityWrittenContainerEvent $event): void
{
//invalidates the product listing route, each time a product - category assignment changed
$ids = $event->getPrimaryKeys(ConfigurationDefinition::ENTITY_NAME);
$productIds = [];
foreach ($ids as $configurationId) {
$productId = $this->connection->fetchFirstColumn(
'SELECT product_id FROM product_translation WHERE JSON_EXTRACT(custom_fields, "$.neon_configurator_products_config") = :configurationId;',
['configurationId' => $configurationId]
);
if ($productId != null) {
$productIds[] = Uuid::fromBytesToHex($productId[0]);
}
}
if (count($productIds) > 0) {
$this->cacheInvalidator->invalidate(
array_map([CachedProductDetailRoute::class, 'buildName'], array_unique($productIds)),
);
}
}
}