Skip to content

Commit d81d262

Browse files
committed
magento/adobe-stock-integration#1391: SaveAssetsKeywordsInterface to delete obsolete keywords - Move and improve logic for saving and deleting obsolete asset keyword links
1 parent 7c2511a commit d81d262

File tree

2 files changed

+118
-80
lines changed

2 files changed

+118
-80
lines changed

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

Lines changed: 118 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
use Magento\Framework\App\ResourceConnection;
1111
use Magento\Framework\DB\Adapter\AdapterInterface;
1212
use Magento\Framework\DB\Adapter\Pdo\Mysql;
13+
use Magento\Framework\Exception\CouldNotDeleteException;
1314
use Magento\Framework\Exception\CouldNotSaveException;
1415
use Magento\MediaGalleryApi\Api\Data\KeywordInterface;
16+
use Magento\MediaGalleryApi\Api\GetAssetsKeywordsInterface;
1517
use Psr\Log\LoggerInterface;
1618

1719
/**
@@ -28,25 +30,33 @@ class SaveAssetLinks
2830
*/
2931
private $resourceConnection;
3032

33+
/**
34+
* @var GetAssetsKeywordsInterface
35+
*/
36+
private $getAssetsKeywordsInterface;
37+
3138
/**
3239
* @var LoggerInterface
3340
*/
3441
private $logger;
3542

3643
/**
44+
* @param GetAssetsKeywordsInterface $getAssetsKeywordsInterface
3745
* @param ResourceConnection $resourceConnection
3846
* @param LoggerInterface $logger
3947
*/
4048
public function __construct(
49+
GetAssetsKeywordsInterface $getAssetsKeywordsInterface,
4150
ResourceConnection $resourceConnection,
4251
LoggerInterface $logger
4352
) {
53+
$this->getAssetsKeywordsInterface = $getAssetsKeywordsInterface;
4454
$this->resourceConnection = $resourceConnection;
4555
$this->logger = $logger;
4656
}
4757

4858
/**
49-
* Save asset keywords links
59+
* Process insert and deletion of asset keywords links
5060
*
5161
* @param int $assetId
5262
* @param KeywordInterface[] $keywordIds
@@ -56,27 +66,123 @@ public function __construct(
5666
public function execute(int $assetId, array $keywordIds): void
5767
{
5868
try {
59-
$values = [];
60-
foreach ($keywordIds as $keywordId) {
61-
$values[] = [$assetId, $keywordId];
69+
$this->deleteAssetKeywords($assetId, $keywordIds);
70+
$this->insertAssetKeywords($assetId, $keywordIds);
71+
} catch (\Exception $exception) {
72+
$this->logger->critical($exception);
73+
throw new CouldNotSaveException(
74+
__('Could not process asset keyword links'),
75+
$exception
76+
);
77+
}
78+
}
79+
80+
/**
81+
* Save new asset keyword links
82+
*
83+
* @param int $assetId
84+
* @param array $keywordIds
85+
* @throws CouldNotSaveException
86+
*/
87+
private function insertAssetKeywords(int $assetId, array $keywordIds): void
88+
{
89+
try {
90+
if (!empty($keywordIds)) {
91+
$values = [];
92+
$keywordsToInsert = array_diff($keywordIds, $this->getCurrentKeywords($assetId));
93+
94+
foreach ($keywordsToInsert as $keywordId) {
95+
$values[] = [$assetId, $keywordId];
96+
}
97+
98+
if (!empty($values)) {
99+
/** @var Mysql $connection */
100+
$connection = $this->resourceConnection->getConnection();
101+
$connection->insertArray(
102+
$this->resourceConnection->getTableName(self::TABLE_ASSET_KEYWORD),
103+
[self::FIELD_ASSET_ID, self::FIELD_KEYWORD_ID],
104+
$values,
105+
AdapterInterface::INSERT_IGNORE
106+
);
107+
}
62108
}
109+
} catch (\Exception $exception) {
110+
$this->logger->critical($exception);
111+
throw new CouldNotSaveException(
112+
__('Could not save asset keyword links'),
113+
$exception
114+
);
115+
}
116+
}
63117

64-
if (!empty($values)) {
118+
/**
119+
* Delete obsolete asset keyword links
120+
*
121+
* @param int $assetId
122+
* @param array $keywords
123+
* @throws CouldNotDeleteException
124+
*/
125+
private function deleteAssetKeywords(int $assetId, array $keywords): void
126+
{
127+
try {
128+
$obsoleteKeywordIds = array_diff($this->getCurrentKeywords($assetId), $keywords);
129+
130+
if (!empty($obsoleteKeywordIds)) {
65131
/** @var Mysql $connection */
66132
$connection = $this->resourceConnection->getConnection();
67-
$connection->insertArray(
68-
$this->resourceConnection->getTableName(self::TABLE_ASSET_KEYWORD),
69-
[self::FIELD_ASSET_ID, self::FIELD_KEYWORD_ID],
70-
$values,
71-
AdapterInterface::INSERT_IGNORE
133+
$connection->delete(
134+
$connection->getTableName(
135+
self::TABLE_ASSET_KEYWORD
136+
),
137+
[
138+
self::FIELD_KEYWORD_ID . ' in (?)' => $obsoleteKeywordIds,
139+
self::FIELD_ASSET_ID . ' = ?' => $assetId
140+
]
72141
);
73142
}
74143
} catch (\Exception $exception) {
75144
$this->logger->critical($exception);
76-
throw new CouldNotSaveException(
77-
__('Could not save asset keyword links'),
145+
throw new CouldNotDeleteException(
146+
__('Could not delete obsolete asset keyword links'),
78147
$exception
79148
);
80149
}
81150
}
151+
152+
/**
153+
* Get current keyword data of an asset
154+
*
155+
* @param int $assetId
156+
* @return array
157+
*/
158+
private function getCurrentKeywords(int $assetId): array
159+
{
160+
$currentKeywordsData = $this->getAssetsKeywordsInterface->execute([$assetId]);
161+
162+
if (!empty($currentKeywordsData)) {
163+
$currentKeywords = $this->getKeywordIdsFromKeywordData(
164+
$currentKeywordsData[$assetId]->getKeywords()
165+
);
166+
167+
return $currentKeywords;
168+
}
169+
170+
return [];
171+
}
172+
173+
/**
174+
* Get keyword ids from keyword data
175+
*
176+
* @param array $keywordsData
177+
* @return array
178+
*/
179+
private function getKeywordIdsFromKeywordData(array $keywordsData): array
180+
{
181+
return array_map(
182+
function (KeywordInterface $keyword): int {
183+
return $keyword->getId();
184+
},
185+
$keywordsData
186+
);
187+
}
82188
}

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

Lines changed: 0 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,7 @@
1111
use Magento\Framework\DB\Adapter\AdapterInterface;
1212
use Magento\Framework\DB\Adapter\Pdo\Mysql;
1313
use Magento\Framework\Exception\CouldNotSaveException;
14-
use Magento\Framework\Exception\CouldNotDeleteException;
1514
use Magento\MediaGalleryApi\Api\Data\KeywordInterface;
16-
use Magento\MediaGalleryApi\Api\GetAssetsKeywordsInterface;
1715
use Magento\MediaGalleryApi\Api\SaveAssetsKeywordsInterface;
1816
use Psr\Log\LoggerInterface;
1917

@@ -23,7 +21,6 @@
2321
class SaveAssetsKeywords implements SaveAssetsKeywordsInterface
2422
{
2523
private const TABLE_KEYWORD = 'media_gallery_keyword';
26-
private const TABLE_ASSET_KEYWORD = 'media_gallery_asset_keyword';
2724
private const ID = 'id';
2825
private const KEYWORD = 'keyword';
2926

@@ -37,11 +34,6 @@ class SaveAssetsKeywords implements SaveAssetsKeywordsInterface
3734
*/
3835
private $saveAssetLinks;
3936

40-
/**
41-
* @var GetAssetsKeywordsInterface
42-
*/
43-
private $getAssetsKeywordsInterface;
44-
4537
/**
4638
* @var LoggerInterface
4739
*/
@@ -52,18 +44,15 @@ class SaveAssetsKeywords implements SaveAssetsKeywordsInterface
5244
*
5345
* @param ResourceConnection $resourceConnection
5446
* @param SaveAssetLinks $saveAssetLinks
55-
* @param GetAssetsKeywordsInterface $getAssetsKeywordsInterface
5647
* @param LoggerInterface $logger
5748
*/
5849
public function __construct(
5950
ResourceConnection $resourceConnection,
6051
SaveAssetLinks $saveAssetLinks,
61-
GetAssetsKeywordsInterface $getAssetsKeywordsInterface,
6252
LoggerInterface $logger
6353
) {
6454
$this->resourceConnection = $resourceConnection;
6555
$this->saveAssetLinks = $saveAssetLinks;
66-
$this->getAssetsKeywordsInterface = $getAssetsKeywordsInterface;
6756
$this->logger = $logger;
6857
}
6958

@@ -94,7 +83,6 @@ public function execute(array $assetKeywords): void
9483
*
9584
* @param KeywordInterface[] $keywords
9685
* @param int $assetId
97-
* @throws CouldNotDeleteException
9886
* @throws CouldNotSaveException
9987
* @throws \Zend_Db_Exception
10088
*/
@@ -109,8 +97,6 @@ private function saveAssetKeywords(array $keywords, int $assetId): void
10997
return;
11098
}
11199

112-
$this->deleteObsoleteAssetKeywords($data, $assetId);
113-
114100
/** @var Mysql $connection */
115101
$connection = $this->resourceConnection->getConnection();
116102
$connection->insertArray(
@@ -139,58 +125,4 @@ private function getKeywordIds(array $keywords): array
139125

140126
return $connection->fetchCol($select);
141127
}
142-
143-
/**
144-
* Deletes obsolete asset keywords links
145-
*
146-
* @param array $newKeywords
147-
* @param int $assetId
148-
* @throws CouldNotDeleteException
149-
*/
150-
private function deleteObsoleteAssetKeywords(array $newKeywords, int $assetId): void
151-
{
152-
$oldKeywordData = $this->getAssetsKeywordsInterface->execute([$assetId]);
153-
154-
if (empty($newKeywords) || empty($oldKeywordData)) {
155-
return;
156-
}
157-
158-
$oldKeywordData = $this->getAssetsKeywordsInterface->execute([$assetId]);
159-
$oldKeywords = $oldKeywordData[$assetId]->getKeywords();
160-
161-
foreach ($oldKeywords as $oldKeyword) {
162-
if (!in_array($oldKeyword->getKeyword(), $newKeywords)) {
163-
$obsoleteKeywords[] = $oldKeyword->getKeyword();
164-
}
165-
}
166-
167-
if (empty($obsoleteKeywords)) {
168-
return;
169-
}
170-
171-
$obsoleteKeywordIds = $this->getKeywordIds($obsoleteKeywords);
172-
173-
try {
174-
/** @var Mysql $connection */
175-
$connection = $this->resourceConnection->getConnection();
176-
$connection->delete(
177-
$connection->getTableName(
178-
self::TABLE_ASSET_KEYWORD
179-
),
180-
[
181-
'keyword_id in (?)' => $obsoleteKeywordIds,
182-
'asset_id = ?' => $assetId
183-
]
184-
);
185-
} catch (\Exception $exception) {
186-
$this->logger->critical($exception);
187-
$failedAssetId = $assetId;
188-
}
189-
190-
if (!empty($failedAssetId)) {
191-
throw new CouldNotDeleteException(
192-
__('Could not delete obsolete keyword relation for asset id: %id', ['id' => $assetId])
193-
);
194-
}
195-
}
196128
}

0 commit comments

Comments
 (0)