Skip to content

Commit

Permalink
Merge pull request #182 from synolia/feature/import-text-asset-attribute
Browse files Browse the repository at this point in the history
Import "text" type asset attributes
  • Loading branch information
TheGrimmChester authored Jan 17, 2024
2 parents faed305 + 33806e2 commit 8169ee8
Show file tree
Hide file tree
Showing 9 changed files with 192 additions and 76 deletions.
33 changes: 33 additions & 0 deletions src/Builder/Asset/Attribute/TextAssetAttributeValueBuilder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

declare(strict_types=1);

namespace Synolia\SyliusAkeneoPlugin\Builder\Asset\Attribute;

use Synolia\SyliusAkeneoPlugin\Provider\Asset\AkeneoAssetAttributePropertiesProviderInterface;
use Synolia\SyliusAkeneoPlugin\Provider\Asset\AssetAttributeTypeMatcherProviderInterface;
use Synolia\SyliusAkeneoPlugin\TypeMatcher\Asset\Attribute\TextAssetAttributeTypeMatcher;

final class TextAssetAttributeValueBuilder implements AssetAttributeValueBuilderInterface
{
public function __construct(
private AssetAttributeTypeMatcherProviderInterface $assetAttributeTypeMatcherProvider,
private AkeneoAssetAttributePropertiesProviderInterface $akeneoAssetAttributePropertiesProvider,
) {
}

public function support(string $assetFamilyCode, string $attributeCode): bool
{
return $this->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];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -25,6 +29,7 @@ public function __construct(
private SyliusAkeneoLocaleCodeProvider $syliusAkeneoLocaleCodeProvider,
private ProductFilterRulesProviderInterface $productFilterRulesProvider,
private AssetValueBuilderProviderInterface $assetAttributeValueBuilder,
private LoggerInterface $akeneoLogger,
) {
}

Expand Down Expand Up @@ -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,
]);
}
}
}
8 changes: 8 additions & 0 deletions src/Processor/ProductAttribute/AssetAttributeProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -36,6 +37,7 @@ public function __construct(
private AkeneoAttributeDataProviderInterface $akeneoAttributeDataProvider,
private AkeneoPimClientInterface $akeneoPimClient,
private AssetProductAttributeProcessorInterface $akeneoAssetProductAttributeProcessor,
private EditionCheckerInterface $editionChecker,
) {
}

Expand All @@ -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 */
Expand Down
82 changes: 49 additions & 33 deletions src/Processor/ProductAttribute/AssetProductAttributeProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -26,6 +30,7 @@ public function __construct(
private SyliusAkeneoLocaleCodeProvider $syliusAkeneoLocaleCodeProvider,
private ProductFilterRulesProviderInterface $productFilterRulesProvider,
private AssetValueBuilderProviderInterface $assetAttributeValueBuilder,
private LoggerInterface $akeneoLogger,
) {
}

Expand Down Expand Up @@ -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,
]);
}
}
}
9 changes: 4 additions & 5 deletions src/Provider/Asset/AkeneoAssetAttributeDataProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -16,7 +15,7 @@ final class AkeneoAssetAttributeDataProvider implements AkeneoAssetAttributeData
public function __construct(
private AkeneoAssetAttributePropertiesProvider $akeneoAssetAttributePropertiesProvider,
private SyliusAkeneoLocaleCodeProvider $syliusAkeneoLocaleCodeProvider,
private AssetAttributeValueBuilderInterface $assetAttributeValueBuilder,
private AssetValueBuilderProviderInterface $assetAttributeValueBuilderProvider,
) {
}

Expand Down Expand Up @@ -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();
Expand All @@ -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();
Expand All @@ -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();
Expand Down
13 changes: 11 additions & 2 deletions src/Provider/Asset/AssetValueBuilderProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,18 @@

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
{
/** @var array<AssetAttributeValueBuilderInterface> */
private array $assetAttributeValueBuilders;

public function __construct(private LoggerInterface $akeneoLogger)
{
public function __construct(
private LoggerInterface $akeneoLogger,
private EditionCheckerInterface $editionChecker,
) {
}

public function addBuilder(AssetAttributeValueBuilderInterface $assetAttributeValueBuilder): void
Expand Down Expand Up @@ -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)) {
Expand Down
33 changes: 33 additions & 0 deletions src/TypeMatcher/Asset/Attribute/TextAssetAttributeTypeMatcher.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

declare(strict_types=1);

namespace Synolia\SyliusAkeneoPlugin\TypeMatcher\Asset\Attribute;

use Sylius\Component\Attribute\AttributeType\TextAttributeType;
use Synolia\SyliusAkeneoPlugin\Builder\Asset\Attribute\TextAssetAttributeValueBuilder;

final class TextAssetAttributeTypeMatcher implements AssetAttributeTypeMatcherInterface
{
private const SUPPORTED_TYPE = 'text';

public function getType(): string
{
return TextAttributeType::TYPE;
}

public function support(string $akeneoType): bool
{
return self::SUPPORTED_TYPE === $akeneoType;
}

public function getBuilder(): string
{
return TextAssetAttributeValueBuilder::class;
}

public function getTypeClassName(): string
{
return TextAttributeType::class;
}
}
Loading

0 comments on commit 8169ee8

Please sign in to comment.