Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OP-149 Add filtering to URLs where wishlist should be created #206

7 changes: 4 additions & 3 deletions features/assigning_wishlist_to_user.feature
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Feature: Assigning a wishlist to a user

@ui
Scenario: Listing wishlists
When I go to "/"
When I go to "/wishlist"
And I log in as "[email protected]"
And I go to "/wishlists"
Then I should have 2 wishlists
Expand All @@ -22,7 +22,7 @@ Feature: Assigning a wishlist to a user
Given the store has a product "Jack Daniels Gentleman" priced at "$10.00"
And all store products appear under a main taxonomy
And I add this product to wishlist
When I go to "/"
When I go to "/wishlist"
And I log in as "[email protected]"
And I go to "/wishlists"
And I follow "Save wishlist"
Expand All @@ -31,7 +31,7 @@ Feature: Assigning a wishlist to a user

@ui @javascript
Scenario: Assigning a wishlist to a user and logout
When I go to "/"
When I go to "/wishlist"
And I log in as "[email protected]"
And I go to "/wishlists"
And I press "wishlist-edit-button-Wishlist1"
Expand All @@ -48,6 +48,7 @@ Feature: Assigning a wishlist to a user
And all store products appear under a main taxonomy
And I add this product to wishlist
When I go to "/"
When I go to "/wishlist"
And I log in as "[email protected]"
And I go to "/wishlists"
And I press "wishlist-edit-button-Wishlist"
Expand Down
2 changes: 1 addition & 1 deletion features/listing_wishlists.feature
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Feature: Listing wishlists

@ui
Scenario: Listing wishlist
Given I am on "/"
Given I am on "/wishlist"
And the store has a wishlist named "Wishlist1"
And the store has a wishlist named "Wishlist2"
When I go to "/wishlists"
Expand Down
2 changes: 1 addition & 1 deletion features/removing_wishlist.feature
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Feature: Removing a wishlist

Background:
Given the store operates on a single channel in "United States"
Given I am on "/"
Given I am on "/wishlist"

@ui @javascript
Scenario: Removing a wishlist
Expand Down
2 changes: 1 addition & 1 deletion features/showing_chosen_wishlist.feature
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Feature: Showing chosen wishlist

Background:
Given the store operates on a single channel in "United States"
Given I am on "/"
Given I am on "/wishlist"

@ui
Scenario: Showing chosen wishlist
Expand Down
27 changes: 18 additions & 9 deletions src/EventSubscriber/CreateNewWishlistSubscriber.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
use Sylius\Component\Core\Model\ShopUserInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
Expand All @@ -47,6 +48,8 @@ final class CreateNewWishlistSubscriber implements EventSubscriberInterface

private TokenUserResolverInterface $tokenUserResolver;

private RequestStack $requestStack;

public function __construct(
string $wishlistCookieToken,
WishlistsResolverInterface $wishlistsResolver,
Expand All @@ -56,6 +59,7 @@ public function __construct(
ChannelContextInterface $channelContext,
WishlistCookieTokenResolverInterface $wishlistCookieTokenResolver,
TokenUserResolverInterface $tokenUserResolver,
RequestStack $requestStack,
) {
$this->wishlistCookieToken = $wishlistCookieToken;
$this->wishlistsResolver = $wishlistsResolver;
Expand All @@ -65,6 +69,7 @@ public function __construct(
$this->channelContext = $channelContext;
$this->wishlistCookieTokenResolver = $wishlistCookieTokenResolver;
$this->tokenUserResolver = $tokenUserResolver;
$this->requestStack = $requestStack;
}

public static function getSubscribedEvents(): array
Expand All @@ -77,18 +82,21 @@ public static function getSubscribedEvents(): array

public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
$request = $this->requestStack->getMainRequest();
$currentPath = $request->getPathInfo();

if (!$event->isMainRequest() || !str_starts_with($currentPath, '/wishlist')) {
return;
}

/** @var WishlistInterface[] $wishlists */
$wishlists = $this->wishlistsResolver->resolve();

$wishlistCookieToken = $event->getRequest()->cookies->get($this->wishlistCookieToken);
$wishlistCookieToken = $request->cookies->get($this->wishlistCookieToken);

if (!empty($wishlists)) {
if (null === $wishlistCookieToken) {
$event->getRequest()->attributes->set($this->wishlistCookieToken, reset($wishlists)->getToken());
$request->attributes->set($this->wishlistCookieToken, reset($wishlists)->getToken());
}

return;
Expand All @@ -99,28 +107,29 @@ public function onKernelRequest(RequestEvent $event): void
$wishlistCookieToken = $this->wishlistCookieTokenResolver->resolve();
}

$event->getRequest()->attributes->set($this->wishlistCookieToken, $wishlistCookieToken);
$request->attributes->set($this->wishlistCookieToken, $wishlistCookieToken);
}

public function onKernelResponse(ResponseEvent $event): void
{
if (!$event->isMainRequest()) {
$request = $this->requestStack->getMainRequest();
$currentPath = $request->getPathInfo();
if (!$event->isMainRequest() || !str_starts_with($currentPath, '/wishlist')) {
return;
}

if ($event->getRequest()->cookies->has($this->wishlistCookieToken)) {
if ($request->cookies->has($this->wishlistCookieToken)) {
return;
}

$response = $event->getResponse();
$wishlistCookieToken = $event->getRequest()->attributes->get($this->wishlistCookieToken);
$wishlistCookieToken = $request->attributes->get($this->wishlistCookieToken);

if (!$wishlistCookieToken) {
return;
}
$this->setWishlistCookieToken($response, $wishlistCookieToken);

$event->getRequest()->attributes->remove($this->wishlistCookieToken);
$request->attributes->remove($this->wishlistCookieToken);
}

private function createNewWishlist(?string $wishlistCookieToken): WishlistInterface
Expand Down
17 changes: 16 additions & 1 deletion src/Resolver/WishlistCookieTokenResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ final class WishlistCookieTokenResolver implements WishlistCookieTokenResolverIn

private string $wishlistCookieToken;

private ?string $generatedToken = null;

public function __construct(
RequestStack $requestStack,
string $wishlistCookieToken
Expand All @@ -30,12 +32,25 @@ public function __construct(

public function resolve(): string
{
if (null !== $this->generatedToken) {
return $this->generatedToken;
}

$wishlistCookieToken = $this->requestStack->getMainRequest()->cookies->get($this->wishlistCookieToken);

if (!$wishlistCookieToken) {
return (string) new WishlistToken();
if ($this->requestStack->getMainRequest()->attributes->get($this->wishlistCookieToken)) {
return $this->requestStack->getMainRequest()->attributes->get($this->wishlistCookieToken);
}

$newToken = (string) new WishlistToken();
$this->generatedToken = $newToken;

return $newToken;
}

$this->generatedToken = $wishlistCookieToken;

return $wishlistCookieToken;
}
}
1 change: 1 addition & 0 deletions src/Resources/config/services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ services:
- "@sylius.context.channel"
- '@bitbag_sylius_wishlist_plugin.resolver.wishlist_cookie_token_resolver'
- '@bitbag_sylius_wishlist_plugin.resolver.token_user_resolver'
- '@request_stack'
tags:
- { name: kernel.event_subscriber, event: kernel.exception }

Expand Down