<?php declare(strict_types=1);
namespace Shopware\Core\Content\ImportExport\DataAbstractionLayer;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\FetchMode;
use Shopware\Core\Content\ImportExport\Exception\DeleteDefaultProfileException;
use Shopware\Core\Content\ImportExport\ImportExportProfileDefinition;
use Shopware\Core\Framework\DataAbstractionLayer\Write\Command\DeleteCommand;
use Shopware\Core\Framework\DataAbstractionLayer\Write\Validation\PreWriteValidationEvent;
use Shopware\Core\Framework\Log\Package;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* @internal
*/
#[Package('system-settings')]
class SystemDefaultValidator implements EventSubscriberInterface
{
private Connection $connection;
public function __construct(Connection $connection)
{
$this->connection = $connection;
}
public static function getSubscribedEvents(): array
{
return [
PreWriteValidationEvent::class => 'preValidate',
];
}
/**
* @internal
*
* @throws DeleteDefaultProfileException
*/
public function preValidate(PreWriteValidationEvent $event): void
{
$ids = [];
$writeCommands = $event->getCommands();
foreach ($writeCommands as $command) {
if ($command->getDefinition()->getClass() === ImportExportProfileDefinition::class
&& $command instanceof DeleteCommand
) {
$ids[] = $command->getPrimaryKey()['id'];
}
}
$filteredIds = $this->filterSystemDefaults($ids);
if (!empty($filteredIds)) {
$event->getExceptions()->add(new DeleteDefaultProfileException($filteredIds));
}
}
private function filterSystemDefaults(array $ids): array
{
if (empty($ids)) {
return [];
}
$result = $this->connection->executeQuery(
'SELECT id FROM import_export_profile WHERE id IN (:idList) AND system_default = 1',
['idList' => $ids],
['idList' => Connection::PARAM_STR_ARRAY]
);
return $result->fetchAll(FetchMode::COLUMN);
}
}