From 1912e214c56e14b594d63e377455102ef014379c Mon Sep 17 00:00:00 2001 From: Dmitriy Krainiy Date: Fri, 31 Mar 2023 21:36:11 +0200 Subject: [PATCH] TE-10886 Dynamic store. (#9457) TE-10886 Release Dynamic Store --- architecture-baseline.json | 7 ++ composer.json | 1 + .../Transfer/synchronization.transfer.xml | 6 ++ .../Export/QueryContainerExporter.php | 71 +++++++++++++-- .../Business/Export/RepositoryExporter.php | 62 +++++++++++-- .../Business/Search/SynchronizationSearch.php | 52 ++++++++++- .../SynchronizationBusinessFactory.php | 12 +++ .../SynchronizationToStoreFacadeBridge.php | 40 ++++++++ .../SynchronizationToStoreFacadeInterface.php | 21 +++++ .../SynchronizationDependencyProvider.php | 23 +++++ .../Export/RepositoryExporterTest.php | 2 + .../Business/SynchronizationFacadeTest.php | 91 ++++++++++++------- 12 files changed, 342 insertions(+), 46 deletions(-) create mode 100644 src/Spryker/Zed/Synchronization/Dependency/Facade/SynchronizationToStoreFacadeBridge.php create mode 100644 src/Spryker/Zed/Synchronization/Dependency/Facade/SynchronizationToStoreFacadeInterface.php diff --git a/architecture-baseline.json b/architecture-baseline.json index 6b4a268..19153c4 100644 --- a/architecture-baseline.json +++ b/architecture-baseline.json @@ -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 getCollection(CriteriaTransfer): 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()`.", diff --git a/composer.json b/composer.json index 0d6e86b..4579141 100644 --- a/composer.json +++ b/composer.json @@ -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", diff --git a/src/Spryker/Shared/Synchronization/Transfer/synchronization.transfer.xml b/src/Spryker/Shared/Synchronization/Transfer/synchronization.transfer.xml index 2f5eb9a..c181864 100644 --- a/src/Spryker/Shared/Synchronization/Transfer/synchronization.transfer.xml +++ b/src/Spryker/Shared/Synchronization/Transfer/synchronization.transfer.xml @@ -15,6 +15,7 @@ + @@ -38,6 +39,7 @@ + @@ -45,4 +47,8 @@ + + + + diff --git a/src/Spryker/Zed/Synchronization/Business/Export/QueryContainerExporter.php b/src/Spryker/Zed/Synchronization/Business/Export/QueryContainerExporter.php index 1d9bf83..34eb71f 100644 --- a/src/Spryker/Zed/Synchronization/Business/Export/QueryContainerExporter.php +++ b/src/Spryker/Zed/Synchronization/Business/Export/QueryContainerExporter.php @@ -7,6 +7,7 @@ namespace Spryker\Zed\Synchronization\Business\Export; +use Generated\Shared\Transfer\QueueSendMessageTransfer; use Generated\Shared\Transfer\SynchronizationQueueMessageTransfer; use Iterator; use Propel\Runtime\ActiveRecord\ActiveRecordInterface; @@ -14,6 +15,7 @@ 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; @@ -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 @@ -67,6 +76,7 @@ public function __construct( $this->queueMessageCreator = $synchronizationQueueMessageCreator; $this->synchronizationDataQueryExpanderStrategyPlugin = $synchronizationDataQueryExpanderStrategyPlugin; $this->chunkSize = $chunkSize ?? static::DEFAULT_CHUNK_SIZE; + $this->storeFacade = $storeFacade; } /** @@ -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(); @@ -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 diff --git a/src/Spryker/Zed/Synchronization/Business/Export/RepositoryExporter.php b/src/Spryker/Zed/Synchronization/Business/Export/RepositoryExporter.php index c9a5a91..c20610a 100644 --- a/src/Spryker/Zed/Synchronization/Business/Export/RepositoryExporter.php +++ b/src/Spryker/Zed/Synchronization/Business/Export/RepositoryExporter.php @@ -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; @@ -50,14 +51,21 @@ 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 @@ -65,6 +73,7 @@ public function __construct( $this->queueClient = $queueClient; $this->queueMessageCreator = $synchronizationQueueMessageCreator; $this->utilEncodingService = $utilEncodingService; + $this->storeFacade = $storeFacade; $this->synchronizationConfig = $synchronizationConfig; } @@ -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( @@ -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; @@ -225,19 +272,22 @@ protected function createSynchronizationQueueMessageTransfers( * @param \Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataPluginInterface $plugin * @param string $synchronizationKey * @param array $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); } /** diff --git a/src/Spryker/Zed/Synchronization/Business/Search/SynchronizationSearch.php b/src/Spryker/Zed/Synchronization/Business/Search/SynchronizationSearch.php index 49ba8f7..9b3eda1 100644 --- a/src/Spryker/Zed/Synchronization/Business/Search/SynchronizationSearch.php +++ b/src/Spryker/Zed/Synchronization/Business/Search/SynchronizationSearch.php @@ -12,6 +12,7 @@ use Spryker\Zed\Synchronization\Business\Synchronization\SynchronizationInterface; use Spryker\Zed\Synchronization\Business\Validation\OutdatedValidatorInterface; use Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToSearchClientInterface; +use Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeInterface; class SynchronizationSearch implements SynchronizationInterface { @@ -40,6 +41,11 @@ class SynchronizationSearch implements SynchronizationInterface */ public const TIMESTAMP = '_timestamp'; + /** + * @var string + */ + protected const STORE = 'store'; + /** * @var \Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToSearchClientInterface */ @@ -50,16 +56,24 @@ class SynchronizationSearch implements SynchronizationInterface */ protected $outdatedValidator; + /** + * @var \Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeInterface + */ + protected $storeFacade; + /** * @param \Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToSearchClientInterface $searchClient * @param \Spryker\Zed\Synchronization\Business\Validation\OutdatedValidatorInterface $outdatedValidator + * @param \Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeInterface $storeFacade */ public function __construct( SynchronizationToSearchClientInterface $searchClient, - OutdatedValidatorInterface $outdatedValidator + OutdatedValidatorInterface $outdatedValidator, + SynchronizationToStoreFacadeInterface $storeFacade ) { $this->searchClient = $searchClient; $this->outdatedValidator = $outdatedValidator; + $this->storeFacade = $storeFacade; } /** @@ -169,6 +183,9 @@ protected function formatTimestamp(array $data) */ public function writeBulk(array $data): void { + if ($this->storeFacade->isDynamicStoreEnabled()) { + $data = $this->expandWithStoreNames($data); + } $dataSets = $this->prepareSearchDocumentTransfers($data); if ($dataSets === []) { @@ -199,6 +216,11 @@ protected function prepareSearchDocumentTransfers(array $data): array $searchDocumentTransfer->setId($key); $searchDocumentTransfer->setData($value); + if ($this->storeFacade->isDynamicStoreEnabled()) { + $store = $datum[static::STORE]; + $searchDocumentTransfer->setStoreName($store); + } + $searchDocumentTransfers[] = $searchDocumentTransfer; } @@ -212,6 +234,9 @@ protected function prepareSearchDocumentTransfers(array $data): array */ public function deleteBulk(array $data): void { + if ($this->storeFacade->isDynamicStoreEnabled()) { + $data = $this->expandWithStoreNames($data); + } $searchDocumentTransfers = $this->prepareSearchDocumentTransfers($data); if ($searchDocumentTransfers === []) { @@ -239,4 +264,29 @@ protected function prepareDeleteBulkDataSets(array $data): array return $dataSets; } + + /** + * @param array $data + * + * @return array + */ + protected function expandWithStoreNames(array $data): array + { + $expandedData = []; + foreach ($data as $datum) { + if (isset($datum[static::STORE]) && $datum[static::STORE] !== '') { + $expandedData[] = $datum; + + continue; + } + + foreach ($this->storeFacade->getAllStores() as $storeTransfer) { + $storeSpecificData = $datum; + $storeSpecificData[static::STORE] = $storeTransfer->getName(); + $expandedData[] = $storeSpecificData; + } + } + + return $expandedData; + } } diff --git a/src/Spryker/Zed/Synchronization/Business/SynchronizationBusinessFactory.php b/src/Spryker/Zed/Synchronization/Business/SynchronizationBusinessFactory.php index 55e81ee..74d7c9b 100644 --- a/src/Spryker/Zed/Synchronization/Business/SynchronizationBusinessFactory.php +++ b/src/Spryker/Zed/Synchronization/Business/SynchronizationBusinessFactory.php @@ -20,6 +20,7 @@ use Spryker\Zed\Synchronization\Business\Search\SynchronizationSearch; use Spryker\Zed\Synchronization\Business\Storage\SynchronizationStorage; use Spryker\Zed\Synchronization\Business\Validation\OutdatedValidator; +use Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeInterface; use Spryker\Zed\Synchronization\SynchronizationDependencyProvider; use Spryker\Zed\SynchronizationExtension\Dependency\Plugin\SynchronizationDataQueryExpanderStrategyPluginInterface; @@ -48,6 +49,7 @@ public function createSearchManager() return new SynchronizationSearch( $this->getSearchClient(), $this->createOutdatedValidator(), + $this->getStoreFacade(), ); } @@ -58,6 +60,7 @@ public function createRepositoryExporter() { return new RepositoryExporter( $this->getQueueClient(), + $this->getStoreFacade(), $this->createQueueMessageCreator(), $this->getUtilEncodingService(), $this->getConfig(), @@ -71,6 +74,7 @@ public function createQueryContainerExporter() { return new QueryContainerExporter( $this->getQueueClient(), + $this->getStoreFacade(), $this->createQueueMessageCreator(), $this->getSynchronizationDataQueryExpanderStrategyPlugin(), $this->getConfig()->getSyncExportChunkSize(), @@ -188,4 +192,12 @@ public function getSynchronizationDataPlugins() { return $this->getProvidedDependency(SynchronizationDependencyProvider::PLUGINS_SYNCHRONIZATION_DATA); } + + /** + * @return \Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeInterface + */ + public function getStoreFacade(): SynchronizationToStoreFacadeInterface + { + return $this->getProvidedDependency(SynchronizationDependencyProvider::FACADE_STORE); + } } diff --git a/src/Spryker/Zed/Synchronization/Dependency/Facade/SynchronizationToStoreFacadeBridge.php b/src/Spryker/Zed/Synchronization/Dependency/Facade/SynchronizationToStoreFacadeBridge.php new file mode 100644 index 0000000..c08d273 --- /dev/null +++ b/src/Spryker/Zed/Synchronization/Dependency/Facade/SynchronizationToStoreFacadeBridge.php @@ -0,0 +1,40 @@ +storeFacade = $storeFacade; + } + + /** + * @return array<\Generated\Shared\Transfer\StoreTransfer> + */ + public function getAllStores(): array + { + return $this->storeFacade->getAllStores(); + } + + /** + * @return bool + */ + public function isDynamicStoreEnabled(): bool + { + return $this->storeFacade->isDynamicStoreEnabled(); + } +} diff --git a/src/Spryker/Zed/Synchronization/Dependency/Facade/SynchronizationToStoreFacadeInterface.php b/src/Spryker/Zed/Synchronization/Dependency/Facade/SynchronizationToStoreFacadeInterface.php new file mode 100644 index 0000000..effe3e1 --- /dev/null +++ b/src/Spryker/Zed/Synchronization/Dependency/Facade/SynchronizationToStoreFacadeInterface.php @@ -0,0 +1,21 @@ + + */ + public function getAllStores(): array; + + /** + * @return bool + */ + public function isDynamicStoreEnabled(): bool; +} diff --git a/src/Spryker/Zed/Synchronization/SynchronizationDependencyProvider.php b/src/Spryker/Zed/Synchronization/SynchronizationDependencyProvider.php index ad46ad0..67084f1 100644 --- a/src/Spryker/Zed/Synchronization/SynchronizationDependencyProvider.php +++ b/src/Spryker/Zed/Synchronization/SynchronizationDependencyProvider.php @@ -13,6 +13,7 @@ use Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToQueueClientBridge; use Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToSearchClientBridge; use Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToStorageClientBridge; +use Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeBridge; use Spryker\Zed\Synchronization\Dependency\Service\SynchronizationToUtilEncodingServiceBridge; /** @@ -20,6 +21,11 @@ */ class SynchronizationDependencyProvider extends AbstractBundleDependencyProvider { + /** + * @var string + */ + public const FACADE_STORE = 'FACADE_STORE'; + /** * @var string */ @@ -63,6 +69,7 @@ public function provideBusinessLayerDependencies(Container $container) $container = $this->addUtilEncodingService($container); $container = $this->addSynchronizationDataPlugins($container); $container = $this->addSynchronizationDataQueryExpanderStrategyPlugin($container); + $container = $this->addStoreFacade($container); return $container; } @@ -178,4 +185,20 @@ protected function getSynchronizationDataQueryExpanderStrategyPlugin() { return new SynchronizationDataQueryExpanderOffsetLimitStrategyPlugin(); } + + /** + * @param \Spryker\Zed\Kernel\Container $container + * + * @return \Spryker\Zed\Kernel\Container + */ + protected function addStoreFacade(Container $container): Container + { + $container->set(static::FACADE_STORE, function (Container $container) { + return new SynchronizationToStoreFacadeBridge( + $container->getLocator()->store()->facade(), + ); + }); + + return $container; + } } diff --git a/tests/SprykerTest/Zed/Synchronization/Business/Export/RepositoryExporterTest.php b/tests/SprykerTest/Zed/Synchronization/Business/Export/RepositoryExporterTest.php index 70f1dc1..62e694d 100644 --- a/tests/SprykerTest/Zed/Synchronization/Business/Export/RepositoryExporterTest.php +++ b/tests/SprykerTest/Zed/Synchronization/Business/Export/RepositoryExporterTest.php @@ -12,6 +12,7 @@ use Spryker\Zed\Synchronization\Business\Export\RepositoryExporter; 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; @@ -70,6 +71,7 @@ protected function createRepositoryExporterMock(bool $disablePropelInstancePool) return $this->getMockBuilder(RepositoryExporter::class) ->setConstructorArgs([ $this->getMockBuilder(SynchronizationToQueueClientInterface::class)->getMock(), + $this->getMockBuilder(SynchronizationToStoreFacadeInterface::class)->getMock(), $this->getMockBuilder(QueueMessageCreatorInterface::class)->getMock(), $this->getMockBuilder(SynchronizationToUtilEncodingServiceInterface::class)->getMock(), $synchronizationConfigStub, diff --git a/tests/SprykerTest/Zed/Synchronization/Business/SynchronizationFacadeTest.php b/tests/SprykerTest/Zed/Synchronization/Business/SynchronizationFacadeTest.php index de167b4..9ebf3a6 100644 --- a/tests/SprykerTest/Zed/Synchronization/Business/SynchronizationFacadeTest.php +++ b/tests/SprykerTest/Zed/Synchronization/Business/SynchronizationFacadeTest.php @@ -55,6 +55,8 @@ use Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToQueueClientInterface; use Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToSearchClientInterface; use Spryker\Zed\Synchronization\Dependency\Client\SynchronizationToStorageClientInterface; +use Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeBridge; +use Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeInterface; use Spryker\Zed\Synchronization\Dependency\Service\SynchronizationToUtilEncodingServiceBridge; use Spryker\Zed\Synchronization\Dependency\Service\SynchronizationToUtilEncodingServiceInterface; use Spryker\Zed\Synchronization\SynchronizationDependencyProvider; @@ -121,17 +123,12 @@ public function testProcessSearchMessages(): void $queueMessageTransfer->setQueueName('test'); $queueMessageTransfer->setQueueMessage($queueMessage); - $container = new Container(); - - $container[SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING] = $this->createUtilEncodingServiceBridge(); - $searchClientBridgeMock = $this->createSearchClientBridge(); $searchClientBridgeMock ->method('read') ->willReturn(new SynchronizationDataTransfer()); $searchClientBridgeMock - ->expects($this->once()) ->method('writeBulk') ->with($this->callback(function (array $data) use ($queueMessageBody) { $searchDocumentTransfer = new SearchDocumentTransfer(); @@ -144,7 +141,6 @@ public function testProcessSearchMessages(): void })); $searchClientBridgeMock - ->expects($this->once()) ->method('deleteBulk') ->with($this->callback(function (array $data) use ($queueMessageBody) { $searchDocumentTransfer = new SearchDocumentTransfer(); @@ -156,7 +152,17 @@ public function testProcessSearchMessages(): void return true; })); - $container[SynchronizationDependencyProvider::CLIENT_SEARCH] = $searchClientBridgeMock; + $container = new Container(); + + $container->set(SynchronizationDependencyProvider::CLIENT_SEARCH, $searchClientBridgeMock); + $container->set( + SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING, + $this->createUtilEncodingServiceBridge(), + ); + $container->set( + SynchronizationDependencyProvider::FACADE_STORE, + $this->createSynchronizationToStoreFacadeBridge(), + ); $this->prepareFacade($container); @@ -192,7 +198,10 @@ public function testProcessStorageMessages(): void $container = new Container(); - $container[SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING] = $this->createUtilEncodingServiceBridge(); + $container->set( + SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING, + $this->createUtilEncodingServiceBridge(), + ); $storageClientMock = $this->createStorageClientBridge(); $storageClientMock @@ -213,7 +222,7 @@ public function testProcessStorageMessages(): void return true; })); - $container[SynchronizationDependencyProvider::CLIENT_STORAGE] = $storageClientMock; + $container->set(SynchronizationDependencyProvider::CLIENT_STORAGE, $storageClientMock); $this->prepareFacade($container); @@ -226,7 +235,7 @@ public function testProcessStorageMessages(): void public function testSynchronizationWritesDataToStorage(): void { $container = new Container(); - $container[SynchronizationDependencyProvider::CLIENT_STORAGE] = function (Container $container) { + $container->set(SynchronizationDependencyProvider::CLIENT_STORAGE, function (Container $container) { $storageMock = $this->createStorageClientBridge(); $storageMock->expects($this->once())->method('set')->will( $this->returnCallback( @@ -238,14 +247,14 @@ function ($key, $value): void { ); return $storageMock; - }; + }); - $container[SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING] = function (Container $container) { + $container->set(SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING, function (Container $container) { $utilEncodingMock = $this->createUtilEncodingServiceBridgeMock(); $utilEncodingMock->expects($this->once())->method('encodeJson')->willReturnArgument(0); return $utilEncodingMock; - }; + }); $this->prepareFacade($container); $this->synchronizationFacade->storageWrite([ @@ -260,7 +269,7 @@ function ($key, $value): void { public function testSynchronizationDeletesDataToStorage(): void { $container = new Container(); - $container[SynchronizationDependencyProvider::CLIENT_STORAGE] = function (Container $container) { + $container->set(SynchronizationDependencyProvider::CLIENT_STORAGE, function (Container $container) { $storageMock = $this->createStorageClientBridge(); $storageMock->expects($this->once())->method('delete')->will( $this->returnCallback( @@ -271,11 +280,12 @@ function ($key): void { ); return $storageMock; - }; + }); - $container[SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING] = function (Container $container) { - return $this->createUtilEncodingServiceBridgeMock(); - }; + $container->set( + SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING, + $this->createUtilEncodingServiceBridgeMock(), + ); $this->prepareFacade($container); $this->synchronizationFacade->storageDelete([ @@ -290,7 +300,7 @@ function ($key): void { public function testSynchronizationWritesDataToSearch(): void { $container = new Container(); - $container[SynchronizationDependencyProvider::CLIENT_SEARCH] = function (Container $container) { + $container->set(SynchronizationDependencyProvider::CLIENT_SEARCH, function (Container $container) { $searchMock = $this->createSearchClientBridge(); $searchMock->expects($this->once())->method('write')->will( $this->returnCallback( @@ -307,13 +317,16 @@ function ($key): void { )); return $searchMock; - }; - - $container[SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING] = function (Container $container) { - $utilEncodingMock = $this->createUtilEncodingServiceBridgeMock(); + }); - return $utilEncodingMock; - }; + $container->set( + SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING, + $this->createUtilEncodingServiceBridgeMock(), + ); + $container->set( + SynchronizationDependencyProvider::FACADE_STORE, + $this->createSynchronizationToStoreFacadeBridge(), + ); $this->prepareFacade($container); $this->synchronizationFacade->searchWrite([ @@ -328,7 +341,7 @@ function ($key): void { public function testSynchronizationDeleteDataToSearch(): void { $container = new Container(); - $container[SynchronizationDependencyProvider::CLIENT_SEARCH] = function (Container $container) { + $container->set(SynchronizationDependencyProvider::CLIENT_SEARCH, function (Container $container) { $searchMock = $this->createSearchClientBridge(); $searchMock->expects($this->once())->method('delete')->will( $this->returnCallback( @@ -345,13 +358,17 @@ function ($key): void { )); return $searchMock; - }; + }); - $container[SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING] = function (Container $container) { - $utilEncodingMock = $this->createUtilEncodingServiceBridgeMock(); + $container->set( + SynchronizationDependencyProvider::SERVICE_UTIL_ENCODING, + $this->createUtilEncodingServiceBridgeMock(), + ); - return $utilEncodingMock; - }; + $container->set( + SynchronizationDependencyProvider::FACADE_STORE, + $this->createSynchronizationToStoreFacadeBridge(), + ); $this->prepareFacade($container); $this->synchronizationFacade->searchDelete([ @@ -516,6 +533,18 @@ protected function createUtilEncodingServiceBridgeMock(): SynchronizationToUtilE ->getMock(); } + /** + * @return \Spryker\Zed\Synchronization\Dependency\Facade\SynchronizationToStoreFacadeInterface + */ + protected function createSynchronizationToStoreFacadeBridge(): SynchronizationToStoreFacadeInterface + { + $container = new Container(); + + return new SynchronizationToStoreFacadeBridge( + $container->getLocator()->store()->facade(), + ); + } + /** * @return \Spryker\Zed\Synchronization\Dependency\Service\SynchronizationToUtilEncodingServiceBridge */