acquia_dam-1.0.0-rc1/src/Controller/MetadataSyncController.php
src/Controller/MetadataSyncController.php
<?php declare(strict_types=1); namespace Drupal\acquia_dam\Controller; use Drupal\acquia_dam\Entity\MediaSourceField; use Drupal\acquia_dam\Plugin\Field\FieldType\AssetItem; use Drupal\acquia_dam\Plugin\media\Source\Asset; use Drupal\Core\Cache\CacheTagsInvalidatorInterface; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\StringTranslation\TranslationInterface; use Drupal\media\MediaInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Controller to sync metadata from DAM to media entity. */ final class MetadataSyncController implements ContainerInjectionInterface { use StringTranslationTrait; /** * The cache tag invalidator. * * @var \Drupal\Core\Cache\CacheTagsInvalidatorInterface */ private $cacheTagsInvalidator; /** * The messenger. * * @var \Drupal\Core\Messenger\MessengerInterface */ private $messenger; /** * Constructs a new MetadataSyncController object. * * @param \Drupal\Core\Cache\CacheTagsInvalidatorInterface $cache_tags_invalidator * The cache tag invalidator. * @param \Drupal\Core\Messenger\MessengerInterface $messenger * The messenger. * @param \Drupal\Core\StringTranslation\TranslationInterface $translation * The translation service. */ public function __construct(CacheTagsInvalidatorInterface $cache_tags_invalidator, MessengerInterface $messenger, TranslationInterface $translation) { $this->cacheTagsInvalidator = $cache_tags_invalidator; $this->messenger = $messenger; $this->stringTranslation = $translation; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new self( $container->get('cache_tags.invalidator'), $container->get('messenger'), $container->get('string_translation') ); } /** * Syncs metadata from DAM to the asset. * * @param \Drupal\media\MediaInterface $media * The media entity. * * @return \Symfony\Component\HttpFoundation\RedirectResponse * The response. */ public function syncMetadata(MediaInterface $media): RedirectResponse { if (!$media->getSource() instanceof Asset) { throw new NotFoundHttpException('Media is not an Acquia DAM asset.'); } $source_field = $media->get(MediaSourceField::SOURCE_FIELD_NAME); $source_field_item = $source_field->first(); assert($source_field_item instanceof AssetItem); $this->cacheTagsInvalidator->invalidateTags(["acquia-dam-asset:$source_field_item->asset_id"]); // Calling `save` causes the MediaStorage to invoke `Media::prepareSave` // which syncs the metadata. $media->save(); $this->messenger->addMessage($this->t('New metadata has been synced for @label. Existing values have not been changed.', [ '@label' => $media->label(), ])); return new RedirectResponse($media->toUrl('collection')->toString()); } }