acquia_dam-1.0.0-rc1/modules/acquia_dam_integration_links/src/EnhancedIntegrationLinkRegister.php
modules/acquia_dam_integration_links/src/EnhancedIntegrationLinkRegister.php
<?php
namespace Drupal\acquia_dam_integration_links;
use Drupal\acquia_dam\IntegrationLinkRegister;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\media\MediaInterface;
use Drupal\paragraphs\ParagraphInterface;
use Psr\Log\LoggerInterface;
/**
* Enhanced integration link register service.
*/
class EnhancedIntegrationLinkRegister {
/**
* Entity field manager service.
*
* @var \Drupal\Core\Entity\EntityFieldManagerInterface
*/
protected $entityFieldManager;
/**
* Integration link register service.
*
* @var \Drupal\acquia_dam\IntegrationLinkRegister
*/
protected $register;
/**
* Asset tracker service.
*
* @var \Drupal\acquia_dam_integration_links\AssetTracker
*/
protected $assetTracker;
/**
* The logger.
*
* @var \Psr\Log\LoggerInterface
*/
protected $logger;
/**
* AssetTracker constructor.
*
* @param \Drupal\Core\Entity\EntityFieldManagerInterface $entityFieldManager
* Entity field manager.
* @param \Drupal\acquia_dam_integration_links\AssetTracker $assetTracker
* Asset tracker service.
* @param \Drupal\acquia_dam\IntegrationLinkRegister $register
* Integration link register service.
* @param \Psr\Log\LoggerInterface $logger
* The logger.
*/
public function __construct(EntityFieldManagerInterface $entityFieldManager, AssetTracker $assetTracker, IntegrationLinkRegister $register, LoggerInterface $logger) {
$this->entityFieldManager = $entityFieldManager;
$this->assetTracker = $assetTracker;
$this->register = $register;
$this->logger = $logger;
}
/**
* Discover asset usage updates, saves locally and notifies the service.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* Entity instance.
*/
public function trackAssetUsage(EntityInterface $entity) {
if (!$this->isEntityEligible($entity)) {
return;
}
$field_definitions = $this
->entityFieldManager
->getFieldDefinitions($entity->getEntityTypeId(), $entity->bundle());
/** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
$title_changed = $this->isTitleChanged($entity);
$result = $this->assetTracker->runAssetDiscovery($entity, $field_definitions, $title_changed);
// If title changes we re-register everything because of description change.
if ($title_changed) {
$this->removeAssetUsage($entity);
}
if (!empty($result['asset_to_register'])) {
$this->registerIntegrationLinks($result['asset_to_register'], $entity);
}
if (!empty($result['assets_to_remove'])) {
foreach ($result['assets_to_remove'] as $asset_id) {
if ($asset_id === NULL || $asset_id === '') {
$this->logger->warning("Empty asset ID found when removing integration link for {$entity->label()} ({$entity->id()}.");
continue;
}
$this->register->addToTrackingDeleteList($asset_id, $entity->uuid());
}
}
}
/**
* Remove all asset usage, deletes from local store and notifies the service.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* Entity instance.
*/
public function removeAssetUsage(EntityInterface $entity): void {
$this->register->addIntegrationToDeleteList($entity->uuid());
}
/**
* Passes discovered usage information to integration link register.
*
* @param array $discovered_usage
* Discovered assets.
* @param \Drupal\Core\Entity\ContentEntityInterface $entity
* Related entity instance.
*/
protected function registerIntegrationLinks(array $discovered_usage, ContentEntityInterface $entity): void {
foreach ($discovered_usage as $asset_uuid) {
$this->register->addIntegrationLinksList($asset_uuid, $entity);
}
}
/**
* Determines if entity is eligible for discovery process.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* Entity instance.
*
* @return bool
* TRUE if discovery process can start, FALSE otherwise.
*/
protected function isEntityEligible(EntityInterface $entity): bool {
if ($entity instanceof MediaInterface || $entity instanceof ParagraphInterface) {
// Media entity reference tracked by the main module.
// Tracking of paragraphs started within ParagraphsAssetDetector.
return FALSE;
}
if ($entity instanceof ContentEntityInterface) {
return TRUE;
}
return FALSE;
}
/**
* Checks title changed or not.
*
* @param \Drupal\Core\Entity\ContentEntityInterface $entity
* Entity instance.
*
* @return bool
* TRUE if label changed, FALSE otherwise.
*/
protected function isTitleChanged(ContentEntityInterface $entity): bool {
if (!isset($entity->original)) {
// Title not changed since entity is new, return FALSE.
return FALSE;
}
return $entity->label() !== $entity->original->label();
}
}
