Skip to content

Commit 6a9f506

Browse files
committed
magento/adobe-stock-integration#1724: Support batches processing for synchronization queue messages - updated pull request with requested changes
1 parent a36a924 commit 6a9f506

File tree

7 files changed

+246
-118
lines changed

7 files changed

+246
-118
lines changed

app/code/Magento/MediaContentSynchronization/Model/Consume.php

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use Magento\AsynchronousOperations\Api\Data\OperationInterface;
1111
use Magento\Framework\Exception\LocalizedException;
1212
use Magento\Framework\Serialize\SerializerInterface;
13+
use Magento\MediaContentApi\Api\Data\ContentIdentityInterfaceFactory;
1314
use Magento\MediaContentSynchronizationApi\Api\SynchronizeIdentitiesInterface;
1415
use Magento\MediaContentSynchronizationApi\Api\SynchronizeInterface;
1516

@@ -18,11 +19,20 @@
1819
*/
1920
class Consume
2021
{
22+
private const ENTITY_TYPE = 'entityType';
23+
private const ENTITY_ID = 'entityId';
24+
private const FIELD = 'field';
25+
2126
/**
2227
* @var SerializerInterface
2328
*/
2429
private $serializer;
2530

31+
/**
32+
* @var ContentIdentityInterfaceFactory
33+
*/
34+
private $contentIdentityFactory;
35+
2636
/**
2737
* @var SynchronizeInterface
2838
*/
@@ -35,15 +45,18 @@ class Consume
3545

3646
/**
3747
* @param SerializerInterface $serializer
48+
* @param ContentIdentityInterfaceFactory $contentIdentityFactory
3849
* @param SynchronizeInterface $synchronize
3950
* @param SynchronizeIdentitiesInterface $synchronizeIdentities
4051
*/
4152
public function __construct(
4253
SerializerInterface $serializer,
54+
ContentIdentityInterfaceFactory $contentIdentityFactory,
4355
SynchronizeInterface $synchronize,
4456
SynchronizeIdentitiesInterface $synchronizeIdentities
4557
) {
4658
$this->serializer = $serializer;
59+
$this->contentIdentityFactory = $contentIdentityFactory;
4760
$this->synchronize = $synchronize;
4861
$this->synchronizeIdentities = $synchronizeIdentities;
4962
}
@@ -56,11 +69,19 @@ public function __construct(
5669
*/
5770
public function execute(OperationInterface $operation) : void
5871
{
59-
$serializedData = $operation->getSerializedData();
60-
$identities = $this->serializer->unserialize($serializedData);
61-
72+
$identities = $this->serializer->unserialize($operation->getSerializedData());
6273
if (!empty($identities)) {
63-
$this->synchronizeIdentities->execute($identities);
74+
$contentIdentity = [];
75+
foreach ($identities as $identity) {
76+
$contentIdentity[] = $this->contentIdentityFactory->create(
77+
[
78+
self::ENTITY_TYPE => $identity[self::ENTITY_TYPE],
79+
self::ENTITY_ID => $identity[self::ENTITY_ID],
80+
self::FIELD => $identity[self::FIELD]
81+
]
82+
);
83+
}
84+
$this->synchronizeIdentities->execute($contentIdentity);
6485
} else {
6586
$this->synchronize->execute();
6687
}

app/code/Magento/MediaContentSynchronization/Model/Publish.php

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,11 @@ public function __construct(
6868
*/
6969
public function execute(array $contentIdentities = []) : void
7070
{
71-
$bulkUuid = $this->identityService->generateId();
72-
$dataToEncode = $this->serializer->serialize($contentIdentities);
73-
7471
$data = [
7572
'data' => [
76-
'bulk_uuid' => $bulkUuid,
73+
'bulk_uuid' => $this->identityService->generateId(),
7774
'topic_name' => self::TOPIC_MEDIA_CONTENT_SYNCHRONIZATION,
78-
'serialized_data' => $dataToEncode,
75+
'serialized_data' => $this->serializer->serialize($contentIdentities),
7976
'status' => OperationInterface::STATUS_TYPE_OPEN,
8077
]
8178
];

app/code/Magento/MediaContentSynchronization/etc/di.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
-->
88
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
99
<preference for="Magento\MediaContentSynchronizationApi\Api\SynchronizeInterface" type="Magento\MediaContentSynchronization\Model\Synchronize"/>
10-
<preference for="Magento\MediaContentSynchronizationApi\Api\SynchronizeIdentitiesInterface" type="Magento\MediaContentSynchronization\Model\SynchronizeIdentities"/>
1110
<type name="Magento\Framework\Console\CommandListInterface">
1211
<arguments>
1312
<argument name="commands" xsi:type="array">
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\MediaContentSynchronizationCatalog\Model\Synchronizer;
9+
10+
use Magento\MediaContentApi\Api\UpdateContentAssetLinksInterface;
11+
use Magento\MediaContentApi\Model\GetEntityContentsInterface;
12+
use Magento\MediaContentSynchronizationApi\Api\SynchronizeIdentitiesInterface;
13+
14+
class SynchronizeIdentitiesCatalog implements SynchronizeIdentitiesInterface
15+
{
16+
/**
17+
* @var UpdateContentAssetLinksInterface
18+
*/
19+
private $updateContentAssetLinks;
20+
21+
/**
22+
* @var GetEntityContentsInterface
23+
*/
24+
private $getEntityContents;
25+
26+
/**
27+
* @param UpdateContentAssetLinksInterface $updateContentAssetLinks
28+
* @param GetEntityContentsInterface $getEntityContents
29+
*/
30+
public function __construct(
31+
UpdateContentAssetLinksInterface $updateContentAssetLinks,
32+
GetEntityContentsInterface $getEntityContents
33+
) {
34+
$this->updateContentAssetLinks = $updateContentAssetLinks;
35+
$this->getEntityContents = $getEntityContents;
36+
}
37+
38+
/**
39+
* @inheritDoc
40+
*/
41+
public function execute(array $mediaContentIdentities): void
42+
{
43+
foreach ($mediaContentIdentities as $identity) {
44+
$this->updateContentAssetLinks->execute(
45+
$identity,
46+
implode(PHP_EOL, $this->getEntityContents->execute($identity))
47+
);
48+
}
49+
}
50+
}

app/code/Magento/MediaContentSynchronization/Test/Integration/Model/SynchronizeIdentitiesTest.php renamed to app/code/Magento/MediaContentSynchronizationCatalog/Test/Integration/Model/Synchronizer/SynchronizeIdentitiesCatalogTest.php

Lines changed: 37 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
*/
66
declare(strict_types=1);
77

8-
namespace Magento\MediaContentSynchronization\Test\Integration\Model;
8+
namespace Magento\MediaContentSynchronizationCatalog\Test\Integration\Model\Synchronizer;
99

1010
use Magento\Framework\Exception\IntegrationException;
11+
use Magento\MediaContentApi\Api\Data\ContentIdentityInterface;
1112
use Magento\MediaContentApi\Api\Data\ContentIdentityInterfaceFactory;
1213
use Magento\MediaContentApi\Api\GetAssetIdsByContentIdentityInterface;
1314
use Magento\MediaContentApi\Api\GetContentByAssetIdsInterface;
@@ -17,10 +18,14 @@
1718
use PHPUnit\Framework\TestCase;
1819

1920
/**
20-
* Test for SynchronizeIdentities.
21+
* Test for catalog SynchronizeIdentities.
2122
*/
22-
class SynchronizeIdentitiesTest extends TestCase
23+
class SynchronizeIdentitiesCatalogTest extends TestCase
2324
{
25+
private const ENTITY_TYPE = 'entityType';
26+
private const ENTITY_ID = 'entityId';
27+
private const FIELD = 'field';
28+
2429
/**
2530
* @var ContentIdentityInterfaceFactory
2631
*/
@@ -59,30 +64,37 @@ protected function setUp(): void
5964
* @dataProvider filesProvider
6065
* @magentoDataFixture Magento/MediaContentCatalog/_files/category_with_asset.php
6166
* @magentoDataFixture Magento/MediaContentCatalog/_files/product_with_asset.php
62-
* @magentoDataFixture Magento/MediaContentCms/_files/page_with_asset.php
63-
* @magentoDataFixture Magento/MediaContentCms/_files/block_with_asset.php
6467
* @magentoDataFixture Magento/MediaGallery/_files/media_asset.php
65-
* @param array $mediaContentIdentities
68+
* @param ContentIdentityInterface[] $mediaContentIdentities
6669
* @throws IntegrationException
6770
*/
6871
public function testExecute(array $mediaContentIdentities): void
6972
{
70-
$this->assertNotEmpty($mediaContentIdentities);
71-
$this->synchronizeIdentities->execute($mediaContentIdentities);
73+
$contentIdentities = [];
74+
foreach ($mediaContentIdentities as $mediaContentIdentity) {
75+
$contentIdentities[] = $this->contentIdentityFactory->create(
76+
[
77+
self::ENTITY_TYPE => $mediaContentIdentity[self::ENTITY_TYPE],
78+
self::ENTITY_ID => $mediaContentIdentity[self::ENTITY_ID],
79+
self::FIELD => $mediaContentIdentity[self::FIELD]
80+
]
81+
);
82+
}
7283

73-
foreach ($mediaContentIdentities as $contentIdentity) {
74-
$assetId = 2020;
75-
$identity = $this->contentIdentityFactory->create($contentIdentity);
76-
$this->assertEquals([$assetId], $this->getAssetIds->execute($identity));
84+
$this->assertNotEmpty($contentIdentities);
85+
$this->synchronizeIdentities->execute($contentIdentities);
7786

87+
foreach ($contentIdentities as $contentIdentity) {
88+
$assetId = 2020;
89+
$this->assertEquals([$assetId], $this->getAssetIds->execute($contentIdentity));
7890
$synchronizedContentIdentities = $this->getContentIdentities->execute([$assetId]);
79-
$this->assertEquals(4, count($synchronizedContentIdentities));
91+
$this->assertEquals(2, count($synchronizedContentIdentities));
8092

8193
$syncedIds = [];
8294
foreach ($synchronizedContentIdentities as $syncedContentIdentity) {
83-
$syncedIds[] = (int)$syncedContentIdentity->getEntityId();
95+
$syncedIds[] = $syncedContentIdentity->getEntityId();
8496
}
85-
$this->assertContains($contentIdentity['entityId'], $syncedIds);
97+
$this->assertContains($contentIdentity->getEntityId(), $syncedIds);
8698
}
8799
}
88100

@@ -96,64 +108,18 @@ public function filesProvider(): array
96108
return [
97109
[
98110
[
99-
$this->getCategoryIdentities(),
100-
$this->getProductIdentities(),
101-
$this->getCmsPageIdentities(),
102-
$this->getCmsBlockIdentities()
111+
[
112+
'entityType' => 'catalog_category',
113+
'field' => 'description',
114+
'entityId' => 28767
115+
],
116+
[
117+
'entityType' => 'catalog_product',
118+
'field' => 'description',
119+
'entityId' => 1567
120+
]
103121
]
104122
]
105123
];
106124
}
107-
108-
/**
109-
* Format category media content identities
110-
*/
111-
public function getCategoryIdentities()
112-
{
113-
$categoryId = 28767;
114-
return [
115-
'entityType' => 'catalog_category',
116-
'field' => 'description',
117-
'entityId' => $categoryId
118-
];
119-
}
120-
121-
/**
122-
* Format product media content identities
123-
*/
124-
public function getProductIdentities()
125-
{
126-
$productId = 1567;
127-
return [
128-
'entityType' => 'catalog_product',
129-
'field' => 'description',
130-
'entityId' => $productId
131-
];
132-
}
133-
134-
/**
135-
* Format cms page media content identities
136-
*/
137-
public function getCmsPageIdentities()
138-
{
139-
$pageId = 5;
140-
return [
141-
'entityType' => 'cms_page',
142-
'field' => 'content',
143-
'entityId' => $pageId
144-
];
145-
}
146-
147-
/**
148-
* Format cms block media content identities
149-
*/
150-
public function getCmsBlockIdentities()
151-
{
152-
$blockId = 1;
153-
return [
154-
'entityType' => 'cms_block',
155-
'field' => 'content',
156-
'entityId' => $blockId
157-
];
158-
}
159125
}

app/code/Magento/MediaContentSynchronization/Model/SynchronizeIdentities.php renamed to app/code/Magento/MediaContentSynchronizationCms/Model/Synchronizer/SynchronizeIdentitiesCms.php

Lines changed: 7 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,26 @@
55
*/
66
declare(strict_types=1);
77

8-
namespace Magento\MediaContentSynchronization\Model;
8+
namespace Magento\MediaContentSynchronizationCms\Model\Synchronizer;
99

1010
use Magento\Framework\App\ResourceConnection;
11-
use Magento\MediaContentApi\Api\Data\ContentIdentityInterfaceFactory;
1211
use Magento\MediaContentApi\Api\UpdateContentAssetLinksInterface;
1312
use Magento\MediaContentApi\Model\GetEntityContentsInterface;
1413
use Magento\MediaContentSynchronizationApi\Api\SynchronizeIdentitiesInterface;
1514

16-
class SynchronizeIdentities implements SynchronizeIdentitiesInterface
15+
class SynchronizeIdentitiesCms implements SynchronizeIdentitiesInterface
1716
{
18-
private const ENTITY_TYPE = 'entityType';
19-
private const ENTITY_ID = 'entityId';
20-
private const FIELD = 'field';
21-
2217
private const FIELD_CMS_PAGE = 'cms_page';
2318
private const FIELD_CMS_BLOCK = 'cms_block';
24-
2519
private const ID_CMS_PAGE = 'page_id';
2620
private const ID_CMS_BLOCK = 'block_id';
27-
2821
private const COLUMN_CMS_CONTENT = 'content';
2922

3023
/**
3124
* @var ResourceConnection
3225
*/
3326
private $resourceConnection;
3427

35-
/**
36-
* @var ContentIdentityInterfaceFactory
37-
*/
38-
private $contentIdentityFactory;
39-
4028
/**
4129
* @var UpdateContentAssetLinksInterface
4230
*/
@@ -49,18 +37,15 @@ class SynchronizeIdentities implements SynchronizeIdentitiesInterface
4937

5038
/**
5139
* @param ResourceConnection $resourceConnection
52-
* @param ContentIdentityInterfaceFactory $contentIdentityFactory
5340
* @param UpdateContentAssetLinksInterface $updateContentAssetLinks
5441
* @param GetEntityContentsInterface $getEntityContents
5542
*/
5643
public function __construct(
5744
ResourceConnection $resourceConnection,
58-
ContentIdentityInterfaceFactory $contentIdentityFactory,
5945
UpdateContentAssetLinksInterface $updateContentAssetLinks,
6046
GetEntityContentsInterface $getEntityContents
6147
) {
6248
$this->resourceConnection = $resourceConnection;
63-
$this->contentIdentityFactory = $contentIdentityFactory;
6449
$this->updateContentAssetLinks = $updateContentAssetLinks;
6550
$this->getEntityContents = $getEntityContents;
6651
}
@@ -71,29 +56,14 @@ public function __construct(
7156
public function execute(array $mediaContentIdentities): void
7257
{
7358
foreach ($mediaContentIdentities as $identity) {
74-
$contentIdentity = $this->contentIdentityFactory->create(
75-
[
76-
self::ENTITY_TYPE => $identity[self::ENTITY_TYPE],
77-
self::ENTITY_ID => $identity[self::ENTITY_ID],
78-
self::FIELD => $identity[self::FIELD]
79-
]
80-
);
81-
82-
if ($identity[self::ENTITY_TYPE] === self::FIELD_CMS_PAGE
83-
|| $identity[self::ENTITY_TYPE] === self::FIELD_CMS_BLOCK
59+
if ($identity->getEntityType() === self::FIELD_CMS_PAGE
60+
|| $identity->getEntityType() === self::FIELD_CMS_BLOCK
8461
) {
85-
$content = $this->getCmsMediaContent(
86-
$identity[self::ENTITY_TYPE],
87-
$identity[self::ENTITY_ID]
62+
$this->updateContentAssetLinks->execute(
63+
$identity,
64+
$this->getCmsMediaContent($identity->getEntityType(), (int)$identity->getEntityId())
8865
);
89-
} else {
90-
$content = implode(PHP_EOL, $this->getEntityContents->execute($contentIdentity));
9166
}
92-
93-
$this->updateContentAssetLinks->execute(
94-
$contentIdentity,
95-
$content
96-
);
9767
}
9868
}
9969

0 commit comments

Comments
 (0)