Skip to content

Commit

Permalink
Change the behaviour of wishlist provider
Browse files Browse the repository at this point in the history
  • Loading branch information
loevgaard committed Nov 26, 2024
1 parent bad2f6f commit 9ba4ea5
Show file tree
Hide file tree
Showing 10 changed files with 30 additions and 68 deletions.
8 changes: 6 additions & 2 deletions src/Controller/AddToWishlistAction.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@

use Doctrine\Persistence\ManagerRegistry;
use Setono\Doctrine\ORMTrait;
use Setono\SyliusWishlistPlugin\Factory\WishlistFactoryInterface;
use Setono\SyliusWishlistPlugin\Factory\WishlistItemFactoryInterface;
use Setono\SyliusWishlistPlugin\Provider\WishlistProviderInterface;
use Sylius\Component\Core\Model\ProductInterface;
use Sylius\Component\Core\Model\ProductVariantInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Twig\Environment;

Expand All @@ -27,13 +27,14 @@ public function __construct(
private readonly WishlistItemFactoryInterface $wishlistItemFactory,
private readonly Environment $twig,
ManagerRegistry $managerRegistry,
private readonly WishlistFactoryInterface $wishlistFactory,
/** @var class-string<ProductInterface|ProductVariantInterface> $className */
private readonly string $className,
) {
$this->managerRegistry = $managerRegistry;
}

public function __invoke(int $id): Response
public function __invoke(int $id): JsonResponse
{
$entity = $this->getManager($this->className)->find($this->className, $id);

Expand All @@ -44,6 +45,9 @@ public function __invoke(int $id): Response
$wishlistItem = $entity instanceof ProductInterface ? $this->wishlistItemFactory->createWithProduct($entity) : $this->wishlistItemFactory->createWithProductVariant($entity);

$preSelectedWishlists = $this->wishlistProvider->getPreSelectedWishlists();
if ([] === $preSelectedWishlists) {
$preSelectedWishlists = [$this->wishlistFactory->createNew()];
}
foreach ($preSelectedWishlists as $wishlist) {
$manager = $this->getManager($wishlist);
$manager->persist($wishlist);
Expand Down
14 changes: 12 additions & 2 deletions src/Factory/WishlistFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,19 @@

namespace Setono\SyliusWishlistPlugin\Factory;

use Setono\ClientBundle\Context\ClientContextInterface;
use Setono\SyliusWishlistPlugin\Model\GuestWishlistInterface;
use Setono\SyliusWishlistPlugin\Model\UserWishlistInterface;
use Setono\SyliusWishlistPlugin\Model\WishlistInterface;
use Sylius\Component\User\Model\UserInterface;
use Symfony\Bundle\SecurityBundle\Security;
use Webmozart\Assert\Assert;

final class WishlistFactory implements WishlistFactoryInterface
{
public function __construct(
private readonly Security $security,
private readonly ClientContextInterface $clientContext,
/** @var class-string<GuestWishlistInterface> $guestWishlistClass */
private readonly string $guestWishlistClass,

Expand All @@ -20,9 +25,14 @@ public function __construct(
) {
}

public function createNew(): never
public function createNew(): WishlistInterface
{
throw new \RuntimeException('Use createForGuest or createForUser instead');
$user = $this->security->getUser();
if ($user instanceof UserInterface) {
return $this->createForUser($user);
}

return $this->createForGuest($this->clientContext->getClient()->id);
}

public function createForGuest(string $clientId): GuestWishlistInterface
Expand Down
9 changes: 4 additions & 5 deletions src/Provider/CompositeWishlistProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,13 @@ final class CompositeWishlistProvider extends CompositeService implements Wishli
public function getWishlists(): array
{
foreach ($this->services as $service) {
try {
return $service->getWishlists();
} catch (\RuntimeException) {
continue;
$wishlists = $service->getWishlists();
if ([] !== $wishlists) {
return $wishlists;
}
}

throw new \RuntimeException('No wishlists found');
return [];
}

public function getPreSelectedWishlists(): array
Expand Down
2 changes: 1 addition & 1 deletion src/Provider/GuestWishlistProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public function getWishlists(): array
$wishlist = $this->guestWishlistRepository->findOneByClientId($this->clientContext->getClient()->id);

if (null === $wishlist) {
throw new \RuntimeException('No wishlists found');
return [];
}

return [$wishlist];
Expand Down
36 changes: 0 additions & 36 deletions src/Provider/NewWishlistProvider.php

This file was deleted.

10 changes: 2 additions & 8 deletions src/Provider/UserWishlistProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,10 @@ public function getWishlists(): array
{
$user = $this->security->getUser();
if (!$user instanceof UserInterface) {
throw new \RuntimeException('No wishlists found');
return [];
}

$wishlists = $this->userWishlistRepository->findByUser($user);

if ([] === $wishlists) {
throw new \RuntimeException('No wishlists found');
}

return $wishlists;
return $this->userWishlistRepository->findByUser($user);
}

public function getPreSelectedWishlists(): array
Expand Down
8 changes: 2 additions & 6 deletions src/Provider/WishlistProviderInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,12 @@
interface WishlistProviderInterface
{
/**
* @return non-empty-list<WishlistInterface>
*
* @throws \RuntimeException if no wishlists are found
* @return list<WishlistInterface>
*/
public function getWishlists(): array;

/**
* @return non-empty-list<WishlistInterface>
*
* @throws \RuntimeException if no wishlists are found
* @return list<WishlistInterface>
*/
public function getPreSelectedWishlists(): array;
}
1 change: 1 addition & 0 deletions src/Resources/config/services/controller.xml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
<argument type="service" id="Setono\SyliusWishlistPlugin\Factory\WishlistItemFactoryInterface"/>
<argument type="service" id="twig"/>
<argument type="service" id="doctrine"/>
<argument type="service" id="Setono\SyliusWishlistPlugin\Factory\WishlistFactoryInterface"/>
</service>

<service id="setono_sylius_wishlist.controller.add_product_to_wishlist"
Expand Down
2 changes: 2 additions & 0 deletions src/Resources/config/services/factory.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

<service id="Setono\SyliusWishlistPlugin\Factory\WishlistFactory"
decorates="setono_sylius_wishlist.factory.wishlist" decoration-priority="64">
<argument type="service" id="Symfony\Bundle\SecurityBundle\Security"/>
<argument type="service" id="setono_client.client_context.default"/>
<argument>%setono_sylius_wishlist.model.guest_wishlist.class%</argument>
<argument>%setono_sylius_wishlist.model.user_wishlist.class%</argument>
</service>
Expand Down
8 changes: 0 additions & 8 deletions src/Resources/config/services/provider.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,5 @@

<tag name="setono_sylius_wishlist.wishlist_provider" priority="-50"/>
</service>

<service id="Setono\SyliusWishlistPlugin\Provider\NewWishlistProvider">
<argument type="service" id="setono_sylius_wishlist.factory.wishlist"/>
<argument type="service" id="security.helper"/>
<argument type="service" id="setono_client.client_context.default"/>

<tag name="setono_sylius_wishlist.wishlist_provider" priority="-60"/>
</service>
</services>
</container>

0 comments on commit 9ba4ea5

Please sign in to comment.