Skip to content

Commit

Permalink
TE-10886 Dynamic store. (#9457)
Browse files Browse the repository at this point in the history
TE-10886 Release Dynamic Store
  • Loading branch information
demkos authored Mar 31, 2023
1 parent ea5e042 commit 1912e21
Show file tree
Hide file tree
Showing 12 changed files with 342 additions and 46 deletions.
7 changes: 7 additions & 0 deletions architecture-baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,13 @@
"ruleset": "Spryker",
"priority": "2"
},
{
"fileName": "src/Spryker/Zed/Synchronization/Dependency/Facade/SynchronizationToStoreFacadeBridge.php",
"description": "Bridges: Method `getAllStores()` must have `public function get<DomainEntity>Collection(<DomainEntity>CriteriaTransfer): <DomainEntity>CollectionTransfer` signature.",
"rule": "BridgeFacadeMethodsRule",
"ruleset": "Spryker",
"priority": "2"
},
{
"fileName": "src/Spryker/Zed/Synchronization/Dependency/Service/SynchronizationToUtilEncodingServiceBridge.php",
"description": "Bridges: Type should be defined for param `value` in method `Spryker\\Zed\\Synchronization\\Dependency\\Service\\SynchronizationToUtilEncodingServiceBridge::encodeJson()`.",
Expand Down
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
"spryker/queue": "^1.0.0",
"spryker/search": "^8.3.0",
"spryker/storage": "^3.4.1",
"spryker/store": "^1.19.0",
"spryker/symfony": "^3.1.0",
"spryker/synchronization-extension": "^1.3.0",
"spryker/transfer": "^3.25.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<property name="value" type="array" singular="value"/>
<property name="resource" type="string"/>
<property name="params" type="array" singular="params"/>
<property name="store" type="string"/>
</transfer>

<transfer name="QueueReceiveMessage">
Expand All @@ -38,11 +39,16 @@
<property name="index" type="string"/>
<property name="id" type="string"/>
<property name="data" type="array" singular="data"/>
<property name="storeName" type="string"/>
</transfer>

<transfer name="SynchronizationDataQueryExpanderStrategyConfiguration">
<property name="offset" type="int"/>
<property name="chunkSize" type="int"/>
</transfer>

<transfer name="Store">
<property name="name" type="string"/>
</transfer>

</transfers>
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,15 @@

namespace Spryker\Zed\Synchronization\Business\Export;

use Generated\Shared\Transfer\QueueSendMessageTransfer;
use Generated\Shared\Transfer\SynchronizationQueueMessageTransfer;
use Iterator;
use Propel\Runtime\ActiveRecord\ActiveRecordInterface;
use Spryker\Zed\Kernel\Persistence\EntityManager\InstancePoolingTrait;
use Spryker\Zed\Synchronization\Business\Iterator\SynchronizationDataQueryContainerPluginIterator;
use Spryker\Zed\Synchronization\Business\Message\QueueMessageCreatorInterface;
use Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToQueueClientInterface;
use Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeInterface;
use Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryContainerPluginInterface;
use Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryExpanderStrategyPluginInterface;

Expand Down Expand Up @@ -51,14 +53,21 @@ class QueryContainerExporter implements ExporterInterface
*/
protected $chunkSize;

/**
* @var \Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeInterface
*/
protected SynchronizationToStoreFacadeInterface $storeFacade;

/**
* @param \Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToQueueClientInterface $queueClient
* @param \Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeInterface $storeFacade
* @param \Spryker\Zed\Synchronization\Business\Message\QueueMessageCreatorInterface $synchronizationQueueMessageCreator
* @param \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryExpanderStrategyPluginInterface $synchronizationDataQueryExpanderStrategyPlugin
* @param int|null $chunkSize
*/
public function __construct(
SynchronizationToQueueClientInterface $queueClient,
SynchronizationToStoreFacadeInterface $storeFacade,
QueueMessageCreatorInterface $synchronizationQueueMessageCreator,
SynchronizationDataQueryExpanderStrategyPluginInterface $synchronizationDataQueryExpanderStrategyPlugin,
$chunkSize
Expand All @@ -67,6 +76,7 @@ public function __construct(
$this->queueMessageCreator = $synchronizationQueueMessageCreator;
$this->synchronizationDataQueryExpanderStrategyPlugin = $synchronizationDataQueryExpanderStrategyPlugin;
$this->chunkSize = $chunkSize ?? static::DEFAULT_CHUNK_SIZE;
$this->storeFacade = $storeFacade;
}

/**
Expand Down Expand Up @@ -122,14 +132,11 @@ protected function syncData(SynchronizationDataQueryContainerPluginInterface $pl
{
$queueSendTransfers = [];
foreach ($synchronizationEntities as $synchronizationEntity) {
$store = $this->getStore($plugin->hasStore(), $synchronizationEntity);
$syncQueueMessage = (new SynchronizationQueueMessageTransfer())
->setKey($synchronizationEntity->getKey())
->setValue($synchronizationEntity->getData())
->setResource($plugin->getResourceName())
->setParams($plugin->getParams());

$queueSendTransfers[] = $this->queueMessageCreator->createQueueMessage($syncQueueMessage, $plugin, $store);
$queueSendTransfers = $this->mapSynchronizationQueueMessageTransfers(
$plugin,
$synchronizationEntity,
$queueSendTransfers,
);

if (method_exists($synchronizationEntity, 'syncPublishedMessageForMappings')) {
$synchronizationEntity->syncPublishedMessageForMappings();
Expand All @@ -139,6 +146,54 @@ protected function syncData(SynchronizationDataQueryContainerPluginInterface $pl
$this->queueClient->sendMessages($plugin->getQueueName(), $queueSendTransfers);
}

/**
* @param \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryContainerPluginInterface $plugin
* @param \Propel\Runtime\ActiveRecord\ActiveRecordInterface $synchronizationEntity
* @param array<\Generated\Shared\Transfer\QueueSendMessageTransfer> $queueSendTransfers
*
* @return array<\Generated\Shared\Transfer\QueueSendMessageTransfer>
*/
protected function mapSynchronizationQueueMessageTransfers(
SynchronizationDataQueryContainerPluginInterface $plugin,
ActiveRecordInterface $synchronizationEntity,
array $queueSendTransfers
): array {
$store = $this->getStore($plugin->hasStore(), $synchronizationEntity);
if ($store || !$this->storeFacade->isDynamicStoreEnabled()) {
$queueSendTransfers[] = $this->createSynchronizationQueueMessageTransfer($plugin, $synchronizationEntity, $store);

return $queueSendTransfers;
}

foreach ($this->storeFacade->getAllStores() as $storeTransfer) {
$queueSendTransfers[] = $this->createSynchronizationQueueMessageTransfer($plugin, $synchronizationEntity, $storeTransfer->getNameOrFail());
}

return $queueSendTransfers;
}

/**
* @param \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryContainerPluginInterface $plugin
* @param \Propel\Runtime\ActiveRecord\ActiveRecordInterface $synchronizationEntity
* @param string|null $store
*
* @return \Generated\Shared\Transfer\QueueSendMessageTransfer
*/
protected function createSynchronizationQueueMessageTransfer(
SynchronizationDataQueryContainerPluginInterface $plugin,
ActiveRecordInterface $synchronizationEntity,
?string $store
): QueueSendMessageTransfer {
$syncQueueMessage = (new SynchronizationQueueMessageTransfer())
->setKey($synchronizationEntity->getKey())
->setValue($synchronizationEntity->getData())
->setResource($plugin->getResourceName())
->setParams($plugin->getParams())
->setStore($store);

return $this->queueMessageCreator->createQueueMessage($syncQueueMessage, $plugin, $store);
}

/**
* @param bool $hasStore
* @param \Propel\Runtime\ActiveRecord\ActiveRecordInterface $entity
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
use Spryker\Zed\Synchronization\Business\Iterator\SynchronizationDataRepositoryPluginIterator;
use Spryker\Zed\Synchronization\Business\Message\QueueMessageCreatorInterface;
use Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToQueueClientInterface;
use Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeInterface;
use Spryker\Zed\Synchronization\Dependency\Service\SynchronizationToUtilEncodingServiceInterface;
use Spryker\Zed\Synchronization\SynchronizationConfig;
use Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataBulkRepositoryPluginInterface;
Expand Down Expand Up @@ -50,21 +51,29 @@ class RepositoryExporter implements ExporterInterface
*/
protected $utilEncodingService;

/**
* @var \Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeInterface
*/
protected SynchronizationToStoreFacadeInterface $storeFacade;

/**
* @param \Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToQueueClientInterface $queueClient
* @param \Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeInterface $storeFacade
* @param \Spryker\Zed\Synchronization\Business\Message\QueueMessageCreatorInterface $synchronizationQueueMessageCreator
* @param \Spryker\Zed\Synchronization\Dependency\Service\SynchronizationToUtilEncodingServiceInterface $utilEncodingService
* @param \Spryker\Zed\Synchronization\SynchronizationConfig $synchronizationConfig
*/
public function __construct(
SynchronizationToQueueClientInterface $queueClient,
SynchronizationToStoreFacadeInterface $storeFacade,
QueueMessageCreatorInterface $synchronizationQueueMessageCreator,
SynchronizationToUtilEncodingServiceInterface $utilEncodingService,
SynchronizationConfig $synchronizationConfig
) {
$this->queueClient = $queueClient;
$this->queueMessageCreator = $synchronizationQueueMessageCreator;
$this->utilEncodingService = $utilEncodingService;
$this->storeFacade = $storeFacade;
$this->synchronizationConfig = $synchronizationConfig;
}

Expand Down Expand Up @@ -165,7 +174,7 @@ protected function syncData(SynchronizationDataPluginInterface $plugin, array $s
$queueSendMessageTransfers = [];
foreach ($synchronizationEntities as $synchronizationEntity) {
$store = $this->getStore($plugin->hasStore(), $synchronizationEntity);
$synchronizationQueueMessageTransfers = $this->createSynchronizationQueueMessageTransfers($plugin, $synchronizationEntity);
$synchronizationQueueMessageTransfers = $this->getSynchronizationQueueMessageTransfers($plugin, $synchronizationEntity, $store);

foreach ($synchronizationQueueMessageTransfers as $synchronizationQueueMessageTransfer) {
$queueSendMessageTransfers[] = $this->queueMessageCreator->createQueueMessage(
Expand Down Expand Up @@ -197,25 +206,63 @@ protected function getStore(bool $hasStore, SynchronizationDataTransfer $entity)
/**
* @param \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataPluginInterface $plugin
* @param \Generated\Shared\Transfer\SynchronizationDataTransfer $synchronizationDataTransfer
* @param string|null $store
*
* @return array<\Generated\Shared\Transfer\SynchronizationQueueMessageTransfer>
*/
protected function getSynchronizationQueueMessageTransfers(
SynchronizationDataPluginInterface $plugin,
SynchronizationDataTransfer $synchronizationDataTransfer,
?string $store = null
): array {
$synchronizationQueueMessageTransfers = [];
if ($store || !$this->storeFacade->isDynamicStoreEnabled()) {
return $this->createSynchronizationQueueMessageTransfers(
$plugin,
$synchronizationDataTransfer,
$synchronizationQueueMessageTransfers,
$store,
);
}

foreach ($this->storeFacade->getAllStores() as $storeTransfer) {
$synchronizationQueueMessageTransfers = $this->createSynchronizationQueueMessageTransfers(
$plugin,
$synchronizationDataTransfer,
$synchronizationQueueMessageTransfers,
$storeTransfer->getNameOrFail(),
);
}

return $synchronizationQueueMessageTransfers;
}

/**
* @param \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataPluginInterface $plugin
* @param \Generated\Shared\Transfer\SynchronizationDataTransfer $synchronizationDataTransfer
* @param array<\Generated\Shared\Transfer\SynchronizationQueueMessageTransfer> $synchronizationQueueMessageTransfers
* @param string|null $store
*
* @return array<\Generated\Shared\Transfer\SynchronizationQueueMessageTransfer>
*/
protected function createSynchronizationQueueMessageTransfers(
SynchronizationDataPluginInterface $plugin,
SynchronizationDataTransfer $synchronizationDataTransfer
SynchronizationDataTransfer $synchronizationDataTransfer,
array $synchronizationQueueMessageTransfers,
?string $store = null
): array {
/** @var array $data */
$data = $synchronizationDataTransfer->getData();

$synchronizationQueueMessageTransfers = [];
$synchronizationQueueMessageTransfers[] = $this->createSynchronizationQueueMessageTransfer(
$plugin,
$synchronizationDataTransfer->getKey(),
$data,
$store,
);

foreach ($this->getSynchronizationMappings($synchronizationDataTransfer) as $mappingKey => $mappingData) {
$synchronizationQueueMessageTransfers[] = $this->createSynchronizationQueueMessageTransfer($plugin, $mappingKey, $mappingData);
$synchronizationQueueMessageTransfers[] = $this->createSynchronizationQueueMessageTransfer($plugin, $mappingKey, $mappingData, $store);
}

return $synchronizationQueueMessageTransfers;
Expand All @@ -225,19 +272,22 @@ protected function createSynchronizationQueueMessageTransfers(
* @param \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataPluginInterface $plugin
* @param string $synchronizationKey
* @param array<string, mixed> $data
* @param string|null $store
*
* @return \Generated\Shared\Transfer\SynchronizationQueueMessageTransfer
*/
protected function createSynchronizationQueueMessageTransfer(
SynchronizationDataPluginInterface $plugin,
string $synchronizationKey,
array $data
array $data,
?string $store = null
): SynchronizationQueueMessageTransfer {
return (new SynchronizationQueueMessageTransfer())
->setKey($synchronizationKey)
->setValue($data)
->setResource($plugin->getResourceName())
->setParams($plugin->getParams());
->setParams($plugin->getParams())
->setStore($store);
}

/**
Expand Down
Loading

0 comments on commit 1912e21

Please sign in to comment.