From c886ff621edb6e390127035b62505f4fae8d3dfa Mon Sep 17 00:00:00 2001 From: tinect Date: Tue, 27 Aug 2024 01:02:47 +0200 Subject: [PATCH 1/3] feat: add dedicated service to find matching redirect --- src/Services/RedirectFinderService.php | 45 +++++++++++++++++++ .../BeforeSendResponseSubscriber.php | 20 ++------- 2 files changed, 49 insertions(+), 16 deletions(-) create mode 100644 src/Services/RedirectFinderService.php diff --git a/src/Services/RedirectFinderService.php b/src/Services/RedirectFinderService.php new file mode 100644 index 0000000..38ef81e --- /dev/null +++ b/src/Services/RedirectFinderService.php @@ -0,0 +1,45 @@ +addFilter(new EqualsFilter('source', $path)) + ->addFilter( + new MultiFilter(MultiFilter::CONNECTION_OR, [ + new EqualsFilter('salesChannelDomainId', $salesChannelDomainId), + new EqualsFilter('salesChannelDomainId', null), + ]) + ) + ->addSorting(new FieldSorting('salesChannelDomainId', FieldSorting::DESCENDING)) + ->setLimit(1); + + $redirect = $this->tinectRedirectsRedirectRepository->search($criteria, $context)->first(); + + if ($redirect instanceof RedirectEntity) { + return $redirect; + } + + return null; + } +} diff --git a/src/Subscriber/BeforeSendResponseSubscriber.php b/src/Subscriber/BeforeSendResponseSubscriber.php index 353305a..51d8b14 100644 --- a/src/Subscriber/BeforeSendResponseSubscriber.php +++ b/src/Subscriber/BeforeSendResponseSubscriber.php @@ -31,7 +31,7 @@ use Symfony\Component\Messenger\MessageBusInterface; use Tinect\Redirects\Content\Redirect\RedirectEntity; use Tinect\Redirects\Message\TinectRedirectUpdateMessage; -use Tinect\Redirects\Services\ExcludedService; +use Tinect\Redirects\Services\RedirectFinderService; readonly class BeforeSendResponseSubscriber implements EventSubscriberInterface { @@ -43,7 +43,8 @@ public function __construct( private SystemConfigService $systemConfigService, private MessageBusInterface $messageBus, private RequestTransformer $requestTransformer, - private ExcludedService $excludedService + private ExcludedService $excludedService, + private RedirectFinderService $redirectFinderService ) { } @@ -102,20 +103,7 @@ private function handleRequest(Request $request): ?Response $salesChannelDomainId = null; } - $context = new Context(new SystemSource()); - $criteria = (new Criteria()) - ->addFilter(new EqualsFilter('source', $path)) - ->addFilter( - new MultiFilter(MultiFilter::CONNECTION_OR, [ - new EqualsFilter('salesChannelDomainId', $salesChannelDomainId), - new EqualsFilter('salesChannelDomainId', null), - ]) - ) - ->addSorting(new FieldSorting('salesChannelDomainId', FieldSorting::DESCENDING)) - ->setLimit(1); - - /** @var ?RedirectEntity $redirect */ - $redirect = $this->tinectRedirectsRedirectRepository->search($criteria, $context)->first(); + $redirect = $this->redirectFinderService->find($path, $salesChannelDomainId); $message = new TinectRedirectUpdateMessage( source: $path, From 8486891fd8cb6cf1cc45b95fe88bf80ec4250f81 Mon Sep 17 00:00:00 2001 From: tinect Date: Tue, 27 Aug 2024 01:05:32 +0200 Subject: [PATCH 2/3] feat: rename method isCreateRedirect to canCreateRedirect in TinectRedirectUpdateMessage --- src/Message/TinectRedirectUpdateMessage.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Message/TinectRedirectUpdateMessage.php b/src/Message/TinectRedirectUpdateMessage.php index c946724..c939947 100644 --- a/src/Message/TinectRedirectUpdateMessage.php +++ b/src/Message/TinectRedirectUpdateMessage.php @@ -57,7 +57,7 @@ public function getReferer(): ?string return substr($this->referer, 0, RedirectRequestDefinition::MAX_LENGTH_REFERER); } - public function isCreateRedirect(): bool + public function canCreateRedirect(): bool { return $this->createRedirect; } From 0280d7f5c746e0d691956b762f9a37c2ce60671b Mon Sep 17 00:00:00 2001 From: tinect Date: Tue, 27 Aug 2024 01:06:58 +0200 Subject: [PATCH 3/3] feat: extract excludeService from ResponseSubscriber to MessageHandler, check for existing redirect in MessageHandler again --- src/Message/TinectRedirectUpdateHandler.php | 38 ++++++++++++------- .../BeforeSendResponseSubscriber.php | 20 ++-------- 2 files changed, 28 insertions(+), 30 deletions(-) diff --git a/src/Message/TinectRedirectUpdateHandler.php b/src/Message/TinectRedirectUpdateHandler.php index c7ca922..584d13c 100644 --- a/src/Message/TinectRedirectUpdateHandler.php +++ b/src/Message/TinectRedirectUpdateHandler.php @@ -9,31 +9,43 @@ use Shopware\Core\Framework\DataAbstractionLayer\Doctrine\RetryableQuery; use Shopware\Core\Framework\Uuid\Uuid; use Symfony\Component\Messenger\Attribute\AsMessageHandler; +use Tinect\Redirects\Services\ExcludedService; +use Tinect\Redirects\Services\RedirectFinderService; #[AsMessageHandler] readonly class TinectRedirectUpdateHandler { public function __construct( private Connection $connection, + private ExcludedService $excludedService, + private RedirectFinderService $redirectFinderService ) { } public function __invoke(TinectRedirectUpdateMessage $message): void { + if ($this->excludedService->isExcluded($message->getSource(), $message->getSalesChannelDomainId())) { + return; + } + $redirectId = $message->getId(); - if ($message->isCreateRedirect()) { - $redirectId = $this->createOrUpdateRedirect($message); - } else { - $this->updateRedirectCount($message); + if ($redirectId === null) { + $redirectId = $this->redirectFinderService->find($message->getSource(), $message->getSalesChannelDomainId())?->getId(); + } + + if ($message->canCreateRedirect()) { + $redirectId = $this->createOrUpdateRedirect($message, $redirectId); + } elseif ($redirectId !== null) { + $this->updateRedirectCount($redirectId); } - if (\is_string($redirectId)) { + if ($redirectId !== null) { $this->createRedirectRequest($message, $redirectId); } } - private function createOrUpdateRedirect(TinectRedirectUpdateMessage $message): string + private function createOrUpdateRedirect(TinectRedirectUpdateMessage $message, ?string $redirectId): string { $query = new RetryableQuery( $this->connection, @@ -44,8 +56,12 @@ private function createOrUpdateRedirect(TinectRedirectUpdateMessage $message): s ) ); + if (!\is_string($redirectId)) { + $redirectId = Uuid::randomHex(); + } + $params = [ - 'id' => \is_string($message->getId()) ? Uuid::fromHexToBytes($message->getId()) : Uuid::randomBytes(), + 'id' => Uuid::fromHexToBytes($redirectId), 'source' => $message->getSource(), 'salesChannelDomainId' => null, 'createdAt' => $message->getCreatedAt()->format(Defaults::STORAGE_DATE_TIME_FORMAT), @@ -60,12 +76,8 @@ private function createOrUpdateRedirect(TinectRedirectUpdateMessage $message): s return Uuid::fromBytesToHex($params['id']); } - private function updateRedirectCount(TinectRedirectUpdateMessage $message): void + private function updateRedirectCount(string $redirectId): void { - if (!\is_string($message->getId())) { - return; - } - $query = new RetryableQuery( $this->connection, $this->connection->prepare( @@ -74,7 +86,7 @@ private function updateRedirectCount(TinectRedirectUpdateMessage $message): void ); $params = [ - 'id' => Uuid::fromHexToBytes($message->getId()), + 'id' => Uuid::fromHexToBytes($redirectId), ]; $query->execute($params); diff --git a/src/Subscriber/BeforeSendResponseSubscriber.php b/src/Subscriber/BeforeSendResponseSubscriber.php index 51d8b14..85dd52e 100644 --- a/src/Subscriber/BeforeSendResponseSubscriber.php +++ b/src/Subscriber/BeforeSendResponseSubscriber.php @@ -5,13 +5,6 @@ namespace Tinect\Redirects\Subscriber; use Shopware\Core\Content\Seo\SeoUrlPlaceholderHandlerInterface; -use Shopware\Core\Framework\Api\Context\SystemSource; -use Shopware\Core\Framework\Context; -use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository; -use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; -use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter; -use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter; -use Shopware\Core\Framework\DataAbstractionLayer\Search\Sorting\FieldSorting; use Shopware\Core\PlatformRequest; use Shopware\Core\SalesChannelRequest; use Shopware\Core\System\SalesChannel\Context\AbstractSalesChannelContextFactory; @@ -29,21 +22,18 @@ use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\Messenger\MessageBusInterface; -use Tinect\Redirects\Content\Redirect\RedirectEntity; use Tinect\Redirects\Message\TinectRedirectUpdateMessage; use Tinect\Redirects\Services\RedirectFinderService; readonly class BeforeSendResponseSubscriber implements EventSubscriberInterface { public function __construct( - private EntityRepository $tinectRedirectsRedirectRepository, private SeoUrlPlaceholderHandlerInterface $seoUrlPlaceholderHandler, #[Autowire(service: SalesChannelContextFactory::class)] private AbstractSalesChannelContextFactory $salesChannelContextFactory, private SystemConfigService $systemConfigService, private MessageBusInterface $messageBus, private RequestTransformer $requestTransformer, - private ExcludedService $excludedService, private RedirectFinderService $redirectFinderService ) { } @@ -110,7 +100,7 @@ private function handleRequest(Request $request): ?Response salesChannelDomainId: $salesChannelDomainId, ipAddress: $this->getIpAddress($request), userAgent: $request->headers->get('User-Agent') ?? '', - createRedirect: $this->canCreateRedirect($path, $salesChannelDomainId), + createRedirect: $this->canCreateRedirect($salesChannelDomainId), id: $redirect?->getId(), referer: $request->headers->get('referer'), ); @@ -198,12 +188,8 @@ private function canSaveIpAddress(?string $salesChannelId): bool return $this->systemConfigService->getBool('TinectRedirects.config.saveIpAddresses', $salesChannelId); } - private function canCreateRedirect(string $path, ?string $salesChannelId): bool + private function canCreateRedirect(?string $salesChannelId): bool { - if (!$this->systemConfigService->getBool('TinectRedirects.config.createNewRedirects', $salesChannelId)) { - return false; - } - - return !$this->excludedService->isExcluded($path, $salesChannelId); + return $this->systemConfigService->getBool('TinectRedirects.config.createNewRedirects', $salesChannelId); } }