diff --git a/src/CommandHandler/Wishlist/CreateWishlistHandler.php b/src/CommandHandler/Wishlist/CreateWishlistHandler.php index 1e29cb5f..3c0146aa 100644 --- a/src/CommandHandler/Wishlist/CreateWishlistHandler.php +++ b/src/CommandHandler/Wishlist/CreateWishlistHandler.php @@ -18,9 +18,11 @@ use Doctrine\Persistence\ObjectManager; use Sylius\Component\Channel\Repository\ChannelRepositoryInterface; use Sylius\Component\Core\Model\ShopUserInterface; +use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\Messenger\Handler\MessageHandlerInterface; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Webmozart\Assert\Assert; final class CreateWishlistHandler implements MessageHandlerInterface { @@ -36,6 +38,10 @@ final class CreateWishlistHandler implements MessageHandlerInterface private TokenUserResolverInterface $tokenUserResolver; + private RequestStack $requestStack; + + private string $wishlistCookieToken; + public function __construct( TokenStorageInterface $tokenStorage, WishlistFactoryInterface $wishlistFactory, @@ -43,6 +49,8 @@ public function __construct( ObjectManager $wishlistManager, ChannelRepositoryInterface $channelRepository, TokenUserResolverInterface $tokenUserResolver, + RequestStack $requestStack, + string $wishlistCookieToken, ) { $this->tokenStorage = $tokenStorage; $this->wishlistFactory = $wishlistFactory; @@ -50,6 +58,8 @@ public function __construct( $this->wishlistManager = $wishlistManager; $this->channelRepository = $channelRepository; $this->tokenUserResolver = $tokenUserResolver; + $this->requestStack = $requestStack; + $this->wishlistCookieToken = $wishlistCookieToken; } public function __invoke(CreateWishlist $createWishlist): WishlistInterface @@ -69,6 +79,10 @@ public function __invoke(CreateWishlist $createWishlist): WishlistInterface if (null !== $createWishlist->getTokenValue()) { $wishlist->setToken($createWishlist->getTokenValue()); + $mainRequest = $this->requestStack->getMainRequest(); + + Assert::notNull($mainRequest, 'The handler is destined to HTTP context only'); + $mainRequest->attributes->set($this->wishlistCookieToken, $createWishlist->getTokenValue()); } $channelCode = $createWishlist->getChannelCode(); diff --git a/src/EventSubscriber/CreateNewWishlistSubscriber.php b/src/EventSubscriber/CreateNewWishlistSubscriber.php index cf23f307..69ffef7f 100644 --- a/src/EventSubscriber/CreateNewWishlistSubscriber.php +++ b/src/EventSubscriber/CreateNewWishlistSubscriber.php @@ -64,7 +64,8 @@ public function onKernelRequest(RequestEvent $event): void } $currentPath = $this->mainRequest->getPathInfo(); - if (!str_starts_with($currentPath, self::ALLOWED_ENDPOINTS_PREFIX)) { + $isWishlistUrl = str_starts_with($currentPath, self::ALLOWED_ENDPOINTS_PREFIX); + if (!$isWishlistUrl) { return; } @@ -94,8 +95,10 @@ public function onKernelResponse(ResponseEvent $event): void return; } + $tokenWasGenerated = $this->mainRequest->attributes->has($this->wishlistCookieToken); $currentPath = $this->mainRequest->getPathInfo(); - if (!str_starts_with($currentPath, self::ALLOWED_ENDPOINTS_PREFIX)) { + $isWishlistUrl = str_starts_with($currentPath, self::ALLOWED_ENDPOINTS_PREFIX); + if (!$tokenWasGenerated && !$isWishlistUrl) { return; } diff --git a/src/Resources/config/services/message_handler.yml b/src/Resources/config/services/message_handler.yml index b10b55ce..fe933449 100644 --- a/src/Resources/config/services/message_handler.yml +++ b/src/Resources/config/services/message_handler.yml @@ -57,6 +57,8 @@ services: - "@bitbag_sylius_wishlist_plugin.manager.wishlist" - "@sylius.repository.channel" - "@bitbag_sylius_wishlist_plugin.resolver.token_user_resolver" + - "@request_stack" + - "%bitbag_sylius_wishlist_plugin.parameters.wishlist_cookie_token%" tags: - { name: messenger.message_handler }