From 35f310cdb201c8f51ebe551b9fa08efc2c742b86 Mon Sep 17 00:00:00 2001 From: Nicolas MELONI Date: Wed, 17 Jan 2024 07:39:27 +0100 Subject: [PATCH 1/2] Import "text" type asset attributes --- .../TextAssetAttributeValueBuilder.php | 33 ++++++++ .../AssetProductAttributeProcessor.php | 82 +++++++++++-------- .../AkeneoAssetAttributeDataProvider.php | 9 +- .../TextAssetAttributeTypeMatcher.php | 33 ++++++++ 4 files changed, 119 insertions(+), 38 deletions(-) create mode 100644 src/Builder/Asset/Attribute/TextAssetAttributeValueBuilder.php create mode 100644 src/TypeMatcher/Asset/Attribute/TextAssetAttributeTypeMatcher.php diff --git a/src/Builder/Asset/Attribute/TextAssetAttributeValueBuilder.php b/src/Builder/Asset/Attribute/TextAssetAttributeValueBuilder.php new file mode 100644 index 00000000..18c27792 --- /dev/null +++ b/src/Builder/Asset/Attribute/TextAssetAttributeValueBuilder.php @@ -0,0 +1,33 @@ +assetAttributeTypeMatcherProvider->match($this->akeneoAssetAttributePropertiesProvider->getType($assetFamilyCode, $attributeCode)) instanceof TextAssetAttributeTypeMatcher; + } + + public function build( + string $assetFamilyCode, + string $assetCode, + ?string $locale, + ?string $scope, + mixed $value, + ): array { + return ['value' => $value]; + } +} diff --git a/src/Processor/ProductAttribute/AssetProductAttributeProcessor.php b/src/Processor/ProductAttribute/AssetProductAttributeProcessor.php index cde48b68..c3848c5a 100644 --- a/src/Processor/ProductAttribute/AssetProductAttributeProcessor.php +++ b/src/Processor/ProductAttribute/AssetProductAttributeProcessor.php @@ -5,10 +5,14 @@ namespace Synolia\SyliusAkeneoPlugin\Processor\ProductAttribute; use Doctrine\ORM\EntityManagerInterface; +use Psr\Log\LoggerInterface; use Sylius\Component\Core\Model\ProductInterface; use Sylius\Component\Resource\Factory\FactoryInterface; use Sylius\Component\Resource\Repository\RepositoryInterface; use Synolia\SyliusAkeneoPlugin\Entity\Asset; +use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationException; +use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationOrScopeException; +use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingScopeException; use Synolia\SyliusAkeneoPlugin\Provider\Asset\AkeneoAssetAttributeDataProviderInterface; use Synolia\SyliusAkeneoPlugin\Provider\Asset\AkeneoAssetAttributePropertiesProviderInterface; use Synolia\SyliusAkeneoPlugin\Provider\Asset\AssetValueBuilderProviderInterface; @@ -26,6 +30,7 @@ public function __construct( private SyliusAkeneoLocaleCodeProvider $syliusAkeneoLocaleCodeProvider, private ProductFilterRulesProviderInterface $productFilterRulesProvider, private AssetValueBuilderProviderInterface $assetAttributeValueBuilder, + private LoggerInterface $akeneoLogger, ) { } @@ -89,40 +94,51 @@ private function handleAsset( return; } - $asset = $this->assetRepository->findOneBy($queryParam); - - if (!$asset instanceof Asset) { - /** @var Asset $asset */ - $asset = $this->assetFactory->createNew(); - $this->entityManager->persist($asset); - $asset->setFamilyCode($assetFamilyCode); - $asset->setAssetCode($assetCode); - $asset->setAttributeCode($attributeCode); - $asset->setLocale($queryParam['locale']); - $asset->setScope($queryParam['scope']); - $asset->setType($this->akeneoAssetAttributePropertiesProvider->getType($assetFamilyCode, $attributeCode)); - } - $akeneoLocale = $this->syliusAkeneoLocaleCodeProvider->getAkeneoLocale($queryParam['locale']); - $assetAttributeValue = $this->akeneoAssetAttributeDataProvider->getData( - $assetFamilyCode, - $attributeCode, - $assetAttributeResource, - $akeneoLocale, - $queryParam['scope'], - ); - - /** @var array $data */ - $data = $this->assetAttributeValueBuilder->build( - $assetFamilyCode, - $attributeCode, - $akeneoLocale, - $queryParam['scope'], - $assetAttributeValue, - ); - - $asset->setContent($data); - $model->addAsset($asset); + try { + $asset = $this->assetRepository->findOneBy($queryParam); + + if (!$asset instanceof Asset) { + /** @var Asset $asset */ + $asset = $this->assetFactory->createNew(); + $this->entityManager->persist($asset); + $asset->setFamilyCode($assetFamilyCode); + $asset->setAssetCode($assetCode); + $asset->setAttributeCode($attributeCode); + $asset->setLocale($queryParam['locale']); + $asset->setScope($queryParam['scope']); + $asset->setType($this->akeneoAssetAttributePropertiesProvider->getType($assetFamilyCode, $attributeCode)); + } + + $assetAttributeValue = $this->akeneoAssetAttributeDataProvider->getData( + $assetFamilyCode, + $attributeCode, + $assetAttributeResource, + $akeneoLocale, + $queryParam['scope'], + ); + + /** @var array $data */ + $data = $this->assetAttributeValueBuilder->build( + $assetFamilyCode, + $attributeCode, + $akeneoLocale, + $queryParam['scope'], + $assetAttributeValue, + ); + + $asset->setContent($data); + $model->addAsset($asset); + } catch (MissingLocaleTranslationException|MissingLocaleTranslationOrScopeException|MissingScopeException) { + $this->akeneoLogger->debug('Error processing asset', [ + 'family_code' => $assetFamilyCode, + 'attribute_code' => $attributeCode, + 'asset_code' => $assetCode, + 'scope' => $queryParam['scope'], + 'akeneo_locale' => $akeneoLocale, + 'resource' => $assetAttributeResource, + ]); + } } } diff --git a/src/Provider/Asset/AkeneoAssetAttributeDataProvider.php b/src/Provider/Asset/AkeneoAssetAttributeDataProvider.php index 27044043..301eddb7 100644 --- a/src/Provider/Asset/AkeneoAssetAttributeDataProvider.php +++ b/src/Provider/Asset/AkeneoAssetAttributeDataProvider.php @@ -4,7 +4,6 @@ namespace Synolia\SyliusAkeneoPlugin\Provider\Asset; -use Synolia\SyliusAkeneoPlugin\Builder\Asset\Attribute\AssetAttributeValueBuilderInterface; use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationException; use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationOrScopeException; use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingScopeException; @@ -16,7 +15,7 @@ final class AkeneoAssetAttributeDataProvider implements AkeneoAssetAttributeData public function __construct( private AkeneoAssetAttributePropertiesProvider $akeneoAssetAttributePropertiesProvider, private SyliusAkeneoLocaleCodeProvider $syliusAkeneoLocaleCodeProvider, - private AssetAttributeValueBuilderInterface $assetAttributeValueBuilder, + private AssetValueBuilderProviderInterface $assetAttributeValueBuilderProvider, ) { } @@ -70,7 +69,7 @@ private function getByScope(string $assetFamilyCode, string $attributeCode, arra continue; } - return $this->assetAttributeValueBuilder->build($assetFamilyCode, $attributeCode, null, $scope, $attributeValue['data']); + return $this->assetAttributeValueBuilderProvider->build($assetFamilyCode, $attributeCode, null, $scope, $attributeValue['data']); } throw new MissingScopeException(); @@ -93,7 +92,7 @@ private function getByLocaleAndScope( continue; } - return $this->assetAttributeValueBuilder->build($assetFamilyCode, $attributeCode, $locale, $scope, $attributeValue['data']); + return $this->assetAttributeValueBuilderProvider->build($assetFamilyCode, $attributeCode, $locale, $scope, $attributeValue['data']); } throw new MissingLocaleTranslationOrScopeException(); @@ -111,7 +110,7 @@ private function getByLocale(string $assetFamilyCode, string $attributeCode, arr continue; } - return $this->assetAttributeValueBuilder->build($assetFamilyCode, $attributeCode, $locale, null, $attributeValue['data']); + return $this->assetAttributeValueBuilderProvider->build($assetFamilyCode, $attributeCode, $locale, null, $attributeValue['data']); } throw new MissingLocaleTranslationException(); diff --git a/src/TypeMatcher/Asset/Attribute/TextAssetAttributeTypeMatcher.php b/src/TypeMatcher/Asset/Attribute/TextAssetAttributeTypeMatcher.php new file mode 100644 index 00000000..a3d72210 --- /dev/null +++ b/src/TypeMatcher/Asset/Attribute/TextAssetAttributeTypeMatcher.php @@ -0,0 +1,33 @@ + Date: Wed, 17 Jan 2024 08:50:59 +0100 Subject: [PATCH 2/2] fix asset attribute import --- ...AkeneoAssetAttributeAttributeProcessor.php | 80 +++++++++++-------- .../AssetAttributeProcessor.php | 8 ++ .../Asset/AssetValueBuilderProvider.php | 13 ++- .../Task/Asset/ProcessAssetsTaskTest.php | 6 +- .../datas/sample/asset_manager_api_all.json | 4 +- 5 files changed, 73 insertions(+), 38 deletions(-) diff --git a/src/Processor/Asset/Attribute/AkeneoAssetAttributeAttributeProcessor.php b/src/Processor/Asset/Attribute/AkeneoAssetAttributeAttributeProcessor.php index 84371149..62444ee6 100644 --- a/src/Processor/Asset/Attribute/AkeneoAssetAttributeAttributeProcessor.php +++ b/src/Processor/Asset/Attribute/AkeneoAssetAttributeAttributeProcessor.php @@ -5,9 +5,13 @@ namespace Synolia\SyliusAkeneoPlugin\Processor\Asset\Attribute; use Doctrine\ORM\EntityManagerInterface; +use Psr\Log\LoggerInterface; use Sylius\Component\Resource\Factory\FactoryInterface; use Sylius\Component\Resource\Repository\RepositoryInterface; use Synolia\SyliusAkeneoPlugin\Entity\Asset; +use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationException; +use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationOrScopeException; +use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingScopeException; use Synolia\SyliusAkeneoPlugin\Provider\Asset\AkeneoAssetAttributeDataProviderInterface; use Synolia\SyliusAkeneoPlugin\Provider\Asset\AkeneoAssetAttributePropertiesProviderInterface; use Synolia\SyliusAkeneoPlugin\Provider\Asset\AssetValueBuilderProviderInterface; @@ -25,6 +29,7 @@ public function __construct( private SyliusAkeneoLocaleCodeProvider $syliusAkeneoLocaleCodeProvider, private ProductFilterRulesProviderInterface $productFilterRulesProvider, private AssetValueBuilderProviderInterface $assetAttributeValueBuilder, + private LoggerInterface $akeneoLogger, ) { } @@ -77,39 +82,50 @@ private function handleAsset( array $queryParam, array $assetAttributeResource, ): void { - $asset = $this->assetRepository->findOneBy($queryParam); - - if (!$asset instanceof Asset) { - /** @var Asset $asset */ - $asset = $this->assetFactory->createNew(); - $this->entityManager->persist($asset); - $asset->setFamilyCode($assetFamilyCode); - $asset->setAssetCode($assetCode); - $asset->setAttributeCode($attributeCode); - $asset->setLocale($queryParam['locale']); - $asset->setScope($queryParam['scope']); - $asset->setType($this->akeneoAssetAttributePropertiesProvider->getType($assetFamilyCode, $attributeCode)); - } - $akeneoLocale = $this->syliusAkeneoLocaleCodeProvider->getAkeneoLocale($queryParam['locale']); - $assetAttributeValue = $this->akeneoAssetAttributeDataProvider->getData( - $assetFamilyCode, - $attributeCode, - $assetAttributeResource, - $akeneoLocale, - $queryParam['scope'], - ); - - /** @var array $data */ - $data = $this->assetAttributeValueBuilder->build( - $assetFamilyCode, - $attributeCode, - $akeneoLocale, - $queryParam['scope'], - $assetAttributeValue, - ); - - $asset->setContent($data); + try { + $asset = $this->assetRepository->findOneBy($queryParam); + + if (!$asset instanceof Asset) { + /** @var Asset $asset */ + $asset = $this->assetFactory->createNew(); + $this->entityManager->persist($asset); + $asset->setFamilyCode($assetFamilyCode); + $asset->setAssetCode($assetCode); + $asset->setAttributeCode($attributeCode); + $asset->setLocale($queryParam['locale']); + $asset->setScope($queryParam['scope']); + $asset->setType($this->akeneoAssetAttributePropertiesProvider->getType($assetFamilyCode, $attributeCode)); + } + + $assetAttributeValue = $this->akeneoAssetAttributeDataProvider->getData( + $assetFamilyCode, + $attributeCode, + $assetAttributeResource, + $akeneoLocale, + $queryParam['scope'], + ); + + /** @var array $data */ + $data = $this->assetAttributeValueBuilder->build( + $assetFamilyCode, + $attributeCode, + $akeneoLocale, + $queryParam['scope'], + $assetAttributeValue, + ); + + $asset->setContent($data); + } catch (MissingLocaleTranslationException|MissingLocaleTranslationOrScopeException|MissingScopeException) { + $this->akeneoLogger->debug('Error processing asset', [ + 'family_code' => $assetFamilyCode, + 'attribute_code' => $attributeCode, + 'asset_code' => $assetCode, + 'scope' => $queryParam['scope'], + 'akeneo_locale' => $akeneoLocale, + 'resource' => $assetAttributeResource, + ]); + } } } diff --git a/src/Processor/ProductAttribute/AssetAttributeProcessor.php b/src/Processor/ProductAttribute/AssetAttributeProcessor.php index 3547e2ef..5e0b0ad6 100644 --- a/src/Processor/ProductAttribute/AssetAttributeProcessor.php +++ b/src/Processor/ProductAttribute/AssetAttributeProcessor.php @@ -11,6 +11,7 @@ use Sylius\Component\Product\Model\ProductAttributeValueInterface; use Sylius\Component\Resource\Factory\FactoryInterface; use Sylius\Component\Resource\Repository\RepositoryInterface; +use Synolia\SyliusAkeneoPlugin\Checker\EditionCheckerInterface; use Synolia\SyliusAkeneoPlugin\Component\Attribute\AttributeType\AssetAttributeType; use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationException; use Synolia\SyliusAkeneoPlugin\Exceptions\Attribute\MissingLocaleTranslationOrScopeException; @@ -36,6 +37,7 @@ public function __construct( private AkeneoAttributeDataProviderInterface $akeneoAttributeDataProvider, private AkeneoPimClientInterface $akeneoPimClient, private AssetProductAttributeProcessorInterface $akeneoAssetProductAttributeProcessor, + private EditionCheckerInterface $editionChecker, ) { } @@ -46,6 +48,12 @@ public static function getDefaultPriority(): int public function support(string $attributeCode, array $context = []): bool { + $isEnterprise = $this->editionChecker->isEnterprise() || $this->editionChecker->isSerenityEdition(); + + if (!$isEnterprise) { + return false; + } + $transformedAttributeCode = $this->akeneoAttributeToSyliusAttributeTransformer->transform($attributeCode); /** @var AttributeInterface $attribute */ diff --git a/src/Provider/Asset/AssetValueBuilderProvider.php b/src/Provider/Asset/AssetValueBuilderProvider.php index e77902fc..748da562 100644 --- a/src/Provider/Asset/AssetValueBuilderProvider.php +++ b/src/Provider/Asset/AssetValueBuilderProvider.php @@ -6,6 +6,7 @@ use Psr\Log\LoggerInterface; use Synolia\SyliusAkeneoPlugin\Builder\Asset\Attribute\AssetAttributeValueBuilderInterface; +use Synolia\SyliusAkeneoPlugin\Checker\EditionCheckerInterface; use Synolia\SyliusAkeneoPlugin\Exceptions\UnsupportedAttributeTypeException; final class AssetValueBuilderProvider implements AssetValueBuilderProviderInterface @@ -13,8 +14,10 @@ final class AssetValueBuilderProvider implements AssetValueBuilderProviderInterf /** @var array */ private array $assetAttributeValueBuilders; - public function __construct(private LoggerInterface $akeneoLogger) - { + public function __construct( + private LoggerInterface $akeneoLogger, + private EditionCheckerInterface $editionChecker, + ) { } public function addBuilder(AssetAttributeValueBuilderInterface $assetAttributeValueBuilder): void @@ -56,6 +59,12 @@ public function findBuilderByClassName(string $className) public function hasSupportedBuilder(string $assetFamilyCode, string $assetCode): bool { + $isEnterprise = $this->editionChecker->isEnterprise() || $this->editionChecker->isSerenityEdition(); + + if (!$isEnterprise) { + return false; + } + foreach ($this->assetAttributeValueBuilders as $attributeValueBuilder) { try { if ($attributeValueBuilder->support($assetFamilyCode, $assetCode)) { diff --git a/tests/PHPUnit/Task/Asset/ProcessAssetsTaskTest.php b/tests/PHPUnit/Task/Asset/ProcessAssetsTaskTest.php index 6ac325e3..b24e86ee 100644 --- a/tests/PHPUnit/Task/Asset/ProcessAssetsTaskTest.php +++ b/tests/PHPUnit/Task/Asset/ProcessAssetsTaskTest.php @@ -21,12 +21,14 @@ */ final class ProcessAssetsTaskTest extends AbstractTaskTest { - private const ASSET_COUNT = 6; + private const ASSET_COUNT = 8; private const LOCALE_COUNT = 3; public function testMediaLinkAsset(): void { + $mockedAssetAttributesJson = $this->getFileContent('asset_manager_attributes_all.json'); + $this->server->setResponseOfPath( '/' . sprintf(AssetFamilyApi::ASSET_FAMILIES_URI), new Response($this->getFileContent('asset_families.json'), [], HttpResponse::HTTP_OK), @@ -44,7 +46,7 @@ public function testMediaLinkAsset(): void $this->server->setResponseOfPath( '/' . sprintf(AssetAttributeApi::ASSET_ATTRIBUTES_URI, 'bynder'), - new Response($this->getFileContent('asset_manager_attributes_all.json'), [], HttpResponse::HTTP_OK), + new Response($mockedAssetAttributesJson, [], HttpResponse::HTTP_OK), ); $payload = new AssetPayload($this->createClient()); diff --git a/tests/PHPUnit/datas/sample/asset_manager_api_all.json b/tests/PHPUnit/datas/sample/asset_manager_api_all.json index e1059fa9..67b20cba 100644 --- a/tests/PHPUnit/datas/sample/asset_manager_api_all.json +++ b/tests/PHPUnit/datas/sample/asset_manager_api_all.json @@ -21,7 +21,7 @@ { "locale": "fr_FR", "channel": null, - "data": "not_imported" + "data": "imported" } ], "media_url": [ @@ -59,7 +59,7 @@ { "locale": "fr_FR", "channel": null, - "data": "not_imported" + "data": "imported" } ], "media_url": [