[ApiBundle] Add common enabled extension for the shop section

This commit is contained in:
Wojdylak 2024-10-22 12:28:47 +02:00
parent 4afed8d478
commit d7274c70cb
No known key found for this signature in database
GPG key ID: 7509E560A6821ABE
4 changed files with 26 additions and 42 deletions

View file

@ -11,22 +11,20 @@
declare(strict_types=1);
namespace Sylius\Bundle\ApiBundle\Doctrine\ORM\QueryExtension\Common;
namespace Sylius\Bundle\ApiBundle\Doctrine\ORM\QueryExtension\Shop\Common;
use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
use ApiPlatform\Doctrine\Orm\Extension\QueryItemExtensionInterface;
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use ApiPlatform\Metadata\Operation;
use Doctrine\ORM\QueryBuilder;
use Sylius\Bundle\ApiBundle\SectionResolver\ShopApiSection;
use Sylius\Bundle\CoreBundle\SectionResolver\SectionProviderInterface;
use Sylius\Resource\Model\ToggleableInterface;
final readonly class EnabledExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
{
public function __construct(
private SectionProviderInterface $sectionProvider,
private string $resourceClass,
private string $section,
) {
public function __construct(private SectionProviderInterface $sectionProvider) {
}
/**
@ -62,11 +60,11 @@ final readonly class EnabledExtension implements QueryCollectionExtensionInterfa
QueryNameGeneratorInterface $queryNameGenerator,
string $resourceClass,
): void {
if (!is_a($resourceClass, $this->resourceClass, true)) {
if (!is_a($resourceClass, ToggleableInterface::class, true)) {
return;
}
if (!$this->sectionProvider->getSection() instanceof $this->section) {
if (!$this->sectionProvider->getSection() instanceof ShopApiSection) {
return;
}

View file

@ -95,16 +95,6 @@
<tag name="api_platform.doctrine.orm.query_extension.item" />
</service>
<service
id="sylius_api.doctrine.orm.query_extension.shop.product.enabled"
class="Sylius\Bundle\ApiBundle\Doctrine\ORM\QueryExtension\Common\EnabledExtension"
>
<argument type="service" id="sylius.section_resolver.uri_based" />
<argument>%sylius.model.product.class%</argument>
<argument>Sylius\Bundle\ApiBundle\SectionResolver\ShopApiSection</argument>
<tag name="api_platform.doctrine.orm.query_extension.collection" />
</service>
<service
id="sylius_api.doctrine.orm.query_extension.shop.country.channel_based"
class="Sylius\Bundle\ApiBundle\Doctrine\ORM\QueryExtension\Shop\Country\ChannelBasedExtension"
@ -177,12 +167,10 @@
</service>
<service
id="sylius_api.doctrine.orm.query_extension.shop.product_variant.enabled"
class="Sylius\Bundle\ApiBundle\Doctrine\ORM\QueryExtension\Common\EnabledExtension"
id="sylius_api.doctrine.orm.query_extension.shop.common.enabled"
class="Sylius\Bundle\ApiBundle\Doctrine\ORM\QueryExtension\Shop\Common\EnabledExtension"
>
<argument type="service" id="sylius.section_resolver.uri_based" />
<argument>%sylius.model.product_variant.class%</argument>
<argument>Sylius\Bundle\ApiBundle\SectionResolver\ShopApiSection</argument>
<tag name="api_platform.doctrine.orm.query_extension.collection" />
<tag name="api_platform.doctrine.orm.query_extension.item" />
</service>
@ -230,16 +218,6 @@
<tag name="api_platform.doctrine.orm.query_extension.item" />
</service>
<service
id="sylius_api.doctrine.orm.query_extension.shop.taxon.enabled"
class="Sylius\Bundle\ApiBundle\Doctrine\ORM\QueryExtension\Common\EnabledExtension"
>
<argument type="service" id="sylius.section_resolver.uri_based" />
<argument>%sylius.model.taxon.class%</argument>
<argument>Sylius\Bundle\ApiBundle\SectionResolver\ShopApiSection</argument>
<tag name="api_platform.doctrine.orm.query_extension.item" />
</service>
<service
id="sylius_api.doctrine.orm.query_extension.shop.product.enabled_within_product_association"
class="Sylius\Bundle\ApiBundle\Doctrine\ORM\QueryExtension\Shop\Product\EnabledWithinProductAssociationExtension"

View file

@ -11,7 +11,7 @@
declare(strict_types=1);
namespace spec\Sylius\Bundle\ApiBundle\Doctrine\ORM\QueryExtension\Common;
namespace spec\Sylius\Bundle\ApiBundle\Doctrine\ORM\QueryExtension\Shop\Common;
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use ApiPlatform\Metadata\Get;
@ -23,16 +23,13 @@ use Sylius\Bundle\ApiBundle\Serializer\ContextKeys;
use Sylius\Bundle\CoreBundle\SectionResolver\SectionProviderInterface;
use Sylius\Component\Core\Model\ChannelInterface;
use Sylius\Component\Core\Model\ProductVariantInterface;
use Sylius\Resource\Model\ToggleableInterface;
final class EnabledExtensionSpec extends ObjectBehavior
{
function let(SectionProviderInterface $sectionProvider): void
{
$this->beConstructedWith(
$sectionProvider,
ProductVariantInterface::class,
ShopApiSection::class,
);
$this->beConstructedWith($sectionProvider);
}
public function it_does_not_apply_conditions_to_item_for_unsupported_resource(
@ -53,7 +50,7 @@ final class EnabledExtensionSpec extends ObjectBehavior
): void {
$sectionProvider->getSection()->willReturn($adminApiSection);
$this->applyToItem($queryBuilder, $queryNameGenerator, ProductVariantInterface::class, []);
$this->applyToItem($queryBuilder, $queryNameGenerator, ToggleableInterface::class, []);
$queryBuilder->getRootAliases()->shouldNotHaveBeenCalled();
$queryBuilder->andWhere()->shouldNotHaveBeenCalled();
@ -77,7 +74,7 @@ final class EnabledExtensionSpec extends ObjectBehavior
$this->applyToItem(
$queryBuilder,
$queryNameGenerator,
ProductVariantInterface::class,
ToggleableInterface::class,
[],
new Get(),
[ContextKeys::CHANNEL => $channel, ContextKeys::LOCALE_CODE => 'en_US'],
@ -102,7 +99,7 @@ final class EnabledExtensionSpec extends ObjectBehavior
): void {
$sectionProvider->getSection()->willReturn($adminApiSection);
$this->applyToCollection($queryBuilder, $queryNameGenerator, ProductVariantInterface::class);
$this->applyToCollection($queryBuilder, $queryNameGenerator, ToggleableInterface::class);
$queryBuilder->getRootAliases()->shouldNotHaveBeenCalled();
$queryBuilder->andWhere()->shouldNotHaveBeenCalled();
@ -126,7 +123,7 @@ final class EnabledExtensionSpec extends ObjectBehavior
$this->applyToCollection(
$queryBuilder,
$queryNameGenerator,
ProductVariantInterface::class,
ToggleableInterface::class,
new Get(),
[ContextKeys::CHANNEL => $channel, ContextKeys::LOCALE_CODE => 'en_US'],
);

View file

@ -29,6 +29,11 @@ Sylius\Component\Core\Model\Product:
channels: ['@channel_web']
currentLocale: 'en_US'
options: ['@product_option_color']
product_mug_disabled:
code: 'MUG_DISABLED'
channels: ['@channel_web']
currentLocale: 'en_US'
enabled: false
Sylius\Component\Core\Model\ProductTranslation:
product_translation_mug:
@ -37,6 +42,12 @@ Sylius\Component\Core\Model\ProductTranslation:
name: 'Mug'
description: '<paragraph(2)>'
translatable: '@product_mug'
product_translation_mug_disabled:
slug: 'mug-disabled'
locale: 'en_US'
name: 'Mug Disabled'
description: '<paragraph(2)>'
translatable: '@product_mug_disabled'
Sylius\Component\Core\Model\ProductVariant:
product_variant_mug_blue: