Skip to content

Commit fe0be1d

Browse files
committed
magento/adobe-stock-integration#1391: SaveAssetsKeywordsInterface to delete obsolete keywords - Code enhancement for SavedAssetLinks logic and updated AssetKeywordsTest
1 parent d81d262 commit fe0be1d

File tree

2 files changed

+56
-26
lines changed

2 files changed

+56
-26
lines changed

app/code/Magento/MediaGallery/Model/ResourceModel/Keyword/SaveAssetLinks.php

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -33,24 +33,24 @@ class SaveAssetLinks
3333
/**
3434
* @var GetAssetsKeywordsInterface
3535
*/
36-
private $getAssetsKeywordsInterface;
36+
private $getAssetsKeywords;
3737

3838
/**
3939
* @var LoggerInterface
4040
*/
4141
private $logger;
4242

4343
/**
44-
* @param GetAssetsKeywordsInterface $getAssetsKeywordsInterface
44+
* @param GetAssetsKeywordsInterface $getAssetsKeywords
4545
* @param ResourceConnection $resourceConnection
4646
* @param LoggerInterface $logger
4747
*/
4848
public function __construct(
49-
GetAssetsKeywordsInterface $getAssetsKeywordsInterface,
49+
GetAssetsKeywordsInterface $getAssetsKeywords,
5050
ResourceConnection $resourceConnection,
5151
LoggerInterface $logger
5252
) {
53-
$this->getAssetsKeywordsInterface = $getAssetsKeywordsInterface;
53+
$this->getAssetsKeywords = $getAssetsKeywords;
5454
$this->resourceConnection = $resourceConnection;
5555
$this->logger = $logger;
5656
}
@@ -66,8 +66,14 @@ public function __construct(
6666
public function execute(int $assetId, array $keywordIds): void
6767
{
6868
try {
69-
$this->deleteAssetKeywords($assetId, $keywordIds);
70-
$this->insertAssetKeywords($assetId, $keywordIds);
69+
$currentKeywordIds = $this->getCurrentKeywordIds($assetId);
70+
71+
$obsoleteKeywordIds = array_diff($currentKeywordIds, $keywordIds);
72+
$newKeywordIds = array_diff($keywordIds, $currentKeywordIds);
73+
74+
$this->deleteAssetKeywords($assetId, $obsoleteKeywordIds);
75+
$this->insertAssetKeywords($assetId, $newKeywordIds);
76+
7177
} catch (\Exception $exception) {
7278
$this->logger->critical($exception);
7379
throw new CouldNotSaveException(
@@ -81,17 +87,16 @@ public function execute(int $assetId, array $keywordIds): void
8187
* Save new asset keyword links
8288
*
8389
* @param int $assetId
84-
* @param array $keywordIds
90+
* @param int[] $keywordIds
8591
* @throws CouldNotSaveException
8692
*/
8793
private function insertAssetKeywords(int $assetId, array $keywordIds): void
8894
{
8995
try {
9096
if (!empty($keywordIds)) {
9197
$values = [];
92-
$keywordsToInsert = array_diff($keywordIds, $this->getCurrentKeywords($assetId));
9398

94-
foreach ($keywordsToInsert as $keywordId) {
99+
foreach ($keywordIds as $keywordId) {
95100
$values[] = [$assetId, $keywordId];
96101
}
97102

@@ -119,14 +124,12 @@ private function insertAssetKeywords(int $assetId, array $keywordIds): void
119124
* Delete obsolete asset keyword links
120125
*
121126
* @param int $assetId
122-
* @param array $keywords
127+
* @param int[] $obsoleteKeywordIds
123128
* @throws CouldNotDeleteException
124129
*/
125-
private function deleteAssetKeywords(int $assetId, array $keywords): void
130+
private function deleteAssetKeywords(int $assetId, array $obsoleteKeywordIds): void
126131
{
127132
try {
128-
$obsoleteKeywordIds = array_diff($this->getCurrentKeywords($assetId), $keywords);
129-
130133
if (!empty($obsoleteKeywordIds)) {
131134
/** @var Mysql $connection */
132135
$connection = $this->resourceConnection->getConnection();
@@ -150,31 +153,29 @@ private function deleteAssetKeywords(int $assetId, array $keywords): void
150153
}
151154

152155
/**
153-
* Get current keyword data of an asset
156+
* Get current keyword ids of an asset
154157
*
155158
* @param int $assetId
156-
* @return array
159+
* @return int[]
157160
*/
158-
private function getCurrentKeywords(int $assetId): array
161+
private function getCurrentKeywordIds(int $assetId): array
159162
{
160-
$currentKeywordsData = $this->getAssetsKeywordsInterface->execute([$assetId]);
163+
$currentKeywordsData = $this->getAssetsKeywords->execute([$assetId]);
161164

162-
if (!empty($currentKeywordsData)) {
163-
$currentKeywords = $this->getKeywordIdsFromKeywordData(
164-
$currentKeywordsData[$assetId]->getKeywords()
165-
);
166-
167-
return $currentKeywords;
165+
if (empty($currentKeywordsData)) {
166+
return [];
168167
}
169168

170-
return [];
169+
return $this->getKeywordIdsFromKeywordData(
170+
$currentKeywordsData[$assetId]->getKeywords()
171+
);
171172
}
172173

173174
/**
174175
* Get keyword ids from keyword data
175176
*
176-
* @param array $keywordsData
177-
* @return array
177+
* @param KeywordInterface[] $keywordsData
178+
* @return int[]
178179
*/
179180
private function getKeywordIdsFromKeywordData(array $keywordsData): array
180181
{

dev/tests/integration/testsuite/Magento/MediaGallery/Model/ResourceModel/AssetKeywordsTest.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ protected function setUp(): void
7272
public function testSaveAndGetKeywords(array $keywords): void
7373
{
7474
$keywords = ['pear', 'plum'];
75+
$updatedKeywords = ['pear', 'apple','orange'];
7576

7677
$loadedAssets = $this->getAssetsByPath->execute([self::FIXTURE_ASSET_PATH]);
7778
$this->assertCount(1, $loadedAssets);
@@ -105,6 +106,34 @@ public function testSaveAndGetKeywords(array $keywords): void
105106
sort($keywords);
106107

107108
$this->assertEquals($keywords, $loadedKeywordStrings);
109+
110+
$updatedAssetKeywords = $this->assetsKeywordsFactory->create(
111+
[
112+
'assetId' => $loadedAsset->getId(),
113+
'keywords' => $this->getKeywords($updatedKeywords)
114+
]
115+
);
116+
$this->saveAssetsKeywords->execute([$updatedAssetKeywords]);
117+
$updatedLoadedAssetKeywords = $this->getAssetsKeywords->execute([$loadedAsset->getId()]);
118+
119+
$this->assertCount(1, $updatedLoadedAssetKeywords);
120+
121+
/** @var AssetKeywordsInterface $updatedLoadedAssetKeywords */
122+
$updatedLoadedAssetKeywords = current($updatedLoadedAssetKeywords);
123+
124+
$updatedLoadedKeywords = $updatedLoadedAssetKeywords->getKeywords();
125+
126+
$this->assertEquals(count($updatedKeywords), count($updatedLoadedKeywords));
127+
128+
$updatedLoadedKeywordStrings = [];
129+
foreach ($updatedLoadedKeywords as $updatedLoadedKeywordObject) {
130+
$updatedLoadedKeywordStrings[] = $updatedLoadedKeywordObject->getKeyword();
131+
}
132+
133+
sort($updatedLoadedKeywordStrings);
134+
sort($updatedKeywords);
135+
136+
$this->assertEquals($updatedKeywords, $updatedLoadedKeywordStrings);
108137
}
109138

110139
/**

0 commit comments

Comments
 (0)