<?php declare(strict_types=1);
namespace Wexo\Relewise\Core\Content\Relewise\Subscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Wexo\Relewise\Api\Data\Export\ExportInterface;
use Wexo\Relewise\Service\Model\Items\Filtering\Condition\ContainsCondition;
use Wexo\Relewise\Service\Model\Items\Filtering\Filter\Product\ProductDataFilter;
use Wexo\Relewise\Service\Model\Items\Filtering\Filter\Product\VariantDataFilter;
use Wexo\Relewise\Api\Data\FilterDataInterface;
use Wexo\Relewise\Core\Content\Relewise\Event\RelewiseRequestEvent;
use Wexo\Relewise\Service\Registry\RelewiseModelRegistry;
use Wexo\Relewise\Service\RelewiseConfigService;
class RelewiseRequestSubscriber implements EventSubscriberInterface
{
/**
* @var RequestStack
*/
protected $requestStack;
/**
* @var RelewiseConfigService
*/
protected $configService;
/**
* @param RequestStack $requestStack
* @param RelewiseConfigService $configService
*/
public function __construct(
RequestStack $requestStack,
RelewiseConfigService $configService
) {
$this->requestStack = $requestStack;
$this->configService = $configService;
}
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
RelewiseRequestEvent::class => [
['fillRelewiseModel', 100],
['addDefaultFilters', 50]
]
];
}
/**
* @param RelewiseRequestEvent $event
*/
public function fillRelewiseModel(RelewiseRequestEvent $event): void
{
$model = $event->getModel();
$request = $this->requestStack->getMainRequest();
RelewiseModelRegistry::fillRelewiseModel($model, $model->getSalesChannelContext(), $request);
}
/**
* @param RelewiseRequestEvent $event
* @return void
*/
public function addDefaultFilters(RelewiseRequestEvent $event): void
{
$model = $event->getModel();
if (!$salesChannelContext = $model->getSalesChannelContext()) {
return;
}
// We do not want to add filters on export models. The export will take care of filters
if ($model instanceof ExportInterface || !$model instanceof FilterDataInterface) {
return;
}
$salesChannelId = $salesChannelContext->getSalesChannelId();
$enableDefaultFilters = $this->configService->isEnabledDefaultFilters($salesChannelId);
if (!$enableDefaultFilters) {
return;
}
// Relewise will ignore filters that are not filtering on the type of item they return
// Therefore these filters will not affect anything to do with content
$filter = new ProductDataFilter('SalesChannels');
$filter->addCondition(new ContainsCondition('String', $salesChannelId));
$model->addFilter($filter);
$filter = new VariantDataFilter('SalesChannels');
$filter->addCondition(new ContainsCondition('String', $salesChannelId));
$model->addFilter($filter);
}
}