Skip to content

Commit 977fab6

Browse files
committed
feat: migrate isExcluded to event system
1 parent 3bbebc5 commit 977fab6

File tree

6 files changed

+96
-26
lines changed

6 files changed

+96
-26
lines changed

src/Command/CleanupExcludesCommand.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,17 @@
1515
use Symfony\Component\Console\Helper\ProgressBar;
1616
use Symfony\Component\Console\Input\InputInterface;
1717
use Symfony\Component\Console\Output\OutputInterface;
18+
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
1819
use Tinect\Redirects\Content\Redirect\RedirectEntity;
19-
use Tinect\Redirects\Services\ExcludedService;
20+
use Tinect\Redirects\Event\IsExcludedEvent;
21+
use Tinect\Redirects\Message\TinectRedirectUpdateMessage;
2022

2123
#[AsCommand(name: 'tinect-redirects:excludes-cleanup', description: 'Cleanup existing entries by re-checking them for the exclude patterns.')]
2224
class CleanupExcludesCommand extends Command
2325
{
2426
public function __construct(
2527
private readonly EntityRepository $tinectRedirectsRedirectRepository,
26-
private readonly ExcludedService $excludedService
28+
private readonly EventDispatcherInterface $dispatcher
2729
) {
2830
parent::__construct($this->getName());
2931
}
@@ -59,7 +61,22 @@ protected function execute(InputInterface $input, OutputInterface $output): int
5961

6062
$salesChannelId = $redirect->getSalesChannelDomain()?->getSalesChannelId();
6163

62-
if ($this->excludedService->isExcluded($redirect->getSource(), $salesChannelId)) {
64+
//TODO: change this with checking the requests
65+
$message = new TinectRedirectUpdateMessage(
66+
source: $redirect->getSource(),
67+
salesChannelDomainId: $redirect->getSalesChannelDomainId(),
68+
ipAddress: '',
69+
userAgent: '',
70+
createRedirect: false,
71+
id: $redirect->getId(),
72+
referer: '',
73+
salesChannelId: $salesChannelId
74+
);
75+
76+
$event = new IsExcludedEvent($message);
77+
$this->dispatcher->dispatch($event);
78+
79+
if ($event->isExcluded()) {
6380
$deleteIds[] = $redirect->getId();
6481
}
6582
}

src/Event/IsExcludedEvent.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Tinect\Redirects\Event;
4+
5+
use Symfony\Contracts\EventDispatcher\Event;
6+
use Tinect\Redirects\Message\TinectRedirectUpdateMessage;
7+
8+
class IsExcludedEvent extends Event
9+
{
10+
private bool $isExcluded = false;
11+
12+
public function __construct(
13+
private readonly TinectRedirectUpdateMessage $redirectUpdateMessage
14+
) {
15+
}
16+
17+
public function isExcluded(): bool
18+
{
19+
return $this->isExcluded;
20+
}
21+
22+
public function setIsExcluded(bool $isExcluded): void
23+
{
24+
$this->isExcluded = $isExcluded;
25+
}
26+
27+
public function getUpdateMessage(): TinectRedirectUpdateMessage
28+
{
29+
return $this->redirectUpdateMessage;
30+
}
31+
}

src/Message/TinectRedirectUpdateHandler.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,26 @@
99
use Shopware\Core\Framework\DataAbstractionLayer\Doctrine\RetryableQuery;
1010
use Shopware\Core\Framework\Uuid\Uuid;
1111
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
12-
use Tinect\Redirects\Services\ExcludedService;
12+
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
13+
use Tinect\Redirects\Event\IsExcludedEvent;
1314
use Tinect\Redirects\Services\RedirectFinderService;
1415

1516
#[AsMessageHandler]
1617
readonly class TinectRedirectUpdateHandler
1718
{
1819
public function __construct(
1920
private Connection $connection,
20-
private ExcludedService $excludedService,
21+
private EventDispatcherInterface $dispatcher,
2122
private RedirectFinderService $redirectFinderService
2223
) {
2324
}
2425

2526
public function __invoke(TinectRedirectUpdateMessage $message): void
2627
{
27-
if ($this->excludedService->isExcluded($message->getSource(), $message->getSalesChannelDomainId())) {
28+
$event = new IsExcludedEvent($message);
29+
$this->dispatcher->dispatch($event);
30+
31+
if ($event->isExcluded()) {
2832
return;
2933
}
3034

src/Message/TinectRedirectUpdateMessage.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public function __construct(
1919
private bool $createRedirect,
2020
private ?string $id,
2121
private ?string $referer,
22+
private ?string $salesChannelId = null
2223
) {
2324
$this->createdAt = new \DateTimeImmutable();
2425
}
@@ -66,4 +67,9 @@ public function getCreatedAt(): \DateTimeImmutable
6667
{
6768
return $this->createdAt;
6869
}
70+
71+
public function getSalesChannelId(): ?string
72+
{
73+
return $this->salesChannelId;
74+
}
6975
}

src/Subscriber/BeforeSendResponseSubscriber.php

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,15 @@ private function handleRequest(Request $request): ?Response
8787
$path = \substr($path, \strlen($salesChannelBaseUrl));
8888
}
8989

90-
$salesChannelDomainId = $request->attributes->get(SalesChannelRequest::ATTRIBUTE_DOMAIN_ID);
90+
$salesChannelId = $request->attributes->getString(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID);
91+
92+
if ($salesChannelId === '') {
93+
$salesChannelId = null;
94+
}
95+
96+
$salesChannelDomainId = $request->attributes->getString(SalesChannelRequest::ATTRIBUTE_DOMAIN_ID);
9197

92-
if (!\is_string($salesChannelDomainId) || empty($salesChannelDomainId)) {
98+
if ($salesChannelDomainId === '') {
9399
$salesChannelDomainId = null;
94100
}
95101

@@ -98,11 +104,12 @@ private function handleRequest(Request $request): ?Response
98104
$message = new TinectRedirectUpdateMessage(
99105
source: $path,
100106
salesChannelDomainId: $salesChannelDomainId,
101-
ipAddress: $this->getIpAddress($request),
107+
ipAddress: $this->getIpAddress($salesChannelId, $request),
102108
userAgent: $request->headers->get('User-Agent') ?? '',
103-
createRedirect: $this->canCreateRedirect($salesChannelDomainId),
109+
createRedirect: $this->canCreateRedirect($salesChannelId),
104110
id: $redirect?->getId(),
105111
referer: $request->headers->get('referer'),
112+
salesChannelId: $salesChannelId
106113
);
107114

108115
$this->messageBus->dispatch($message);
@@ -168,14 +175,8 @@ private function createSalesChannelContext(string $salesChannelId, string $langu
168175
);
169176
}
170177

171-
private function getIpAddress(Request $request): string
178+
private function getIpAddress(?string $salesChannelId, Request $request): string
172179
{
173-
$salesChannelId = $request->attributes->getString(PlatformRequest::ATTRIBUTE_SALES_CHANNEL_ID);
174-
175-
if ($salesChannelId === '') {
176-
$salesChannelId = null;
177-
}
178-
179180
if (!$this->canSaveIpAddress($salesChannelId)) {
180181
return '';
181182
}
Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<?php
22

3-
declare(strict_types=1);
4-
5-
namespace Tinect\Redirects\Services;
3+
namespace Tinect\Redirects\Subscriber;
64

75
use Shopware\Core\System\SystemConfig\SystemConfigService;
6+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
7+
use Tinect\Redirects\Event\IsExcludedEvent;
88

9-
class ExcludedService
9+
class isExcludedEventSubscriber implements EventSubscriberInterface
1010
{
1111
/**
1212
* Key is sales channel id, value is an array of exclude patterns.
@@ -16,12 +16,23 @@ class ExcludedService
1616
private array $excludes = [];
1717

1818
public function __construct(
19-
private readonly SystemConfigService $systemConfigService,
19+
private readonly SystemConfigService $systemConfigService
2020
) {
2121
}
2222

23-
public function isExcluded(string $path, ?string $salesChannelId): bool
23+
public static function getSubscribedEvents(): array
24+
{
25+
return [
26+
IsExcludedEvent::class => ['isExcluded', -1000],
27+
];
28+
}
29+
30+
public function isExcluded(IsExcludedEvent $event): void
2431
{
32+
$message = $event->getUpdateMessage();
33+
$path = $message->getSource();
34+
$salesChannelId = $message->getSalesChannelId();
35+
2536
if (!isset($this->excludes[$salesChannelId])) {
2637
$excludes = \array_filter(\explode(PHP_EOL, $this->systemConfigService->getString('TinectRedirects.config.excludes', $salesChannelId)));
2738
$this->excludes[$salesChannelId] = $excludes;
@@ -32,13 +43,13 @@ public function isExcluded(string $path, ?string $salesChannelId): bool
3243
foreach ($excludes as $exclude) {
3344
try {
3445
if (\preg_match($exclude, $path)) {
35-
return true;
46+
$event->setIsExcluded(true);
47+
48+
return;
3649
}
3750
} catch (\Throwable) {
3851
// nth, we don't care whether the regex is valid
3952
}
4053
}
41-
42-
return false;
4354
}
4455
}

0 commit comments

Comments
 (0)