90 lines
2.4 KiB
90 lines
2.4 KiB
<?php |
|
|
|
namespace Drupal\islandora\EventSubscriber; |
|
|
|
use Drupal\Core\Url; |
|
use Drupal\media\MediaInterface; |
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface; |
|
use Symfony\Component\HttpKernel\Event\FilterResponseEvent; |
|
|
|
/** |
|
* Class MediaLinkHeaderSubscriber. |
|
* |
|
* @package Drupal\islandora\EventSubscriber |
|
*/ |
|
class MediaLinkHeaderSubscriber extends LinkHeaderSubscriber implements EventSubscriberInterface { |
|
|
|
/** |
|
* {@inheritdoc} |
|
*/ |
|
public function onResponse(FilterResponseEvent $event) { |
|
$response = $event->getResponse(); |
|
|
|
$media = $this->getObject($response, 'media'); |
|
|
|
if ($media === FALSE) { |
|
return; |
|
} |
|
|
|
$links = array_merge( |
|
$this->generateEntityReferenceLinks($media), |
|
$this->generateRestLinks($media), |
|
$this->generateMediaLinks($media) |
|
); |
|
|
|
// Add the link headers to the response. |
|
if (empty($links)) { |
|
return; |
|
} |
|
|
|
$response->headers->set('Link', $links, FALSE); |
|
} |
|
|
|
/** |
|
* Generates link headers for the described file and source update routes. |
|
* |
|
* @param \Drupal\media\MediaInterface $media |
|
* Media to generate link headers. |
|
* |
|
* @return string[] |
|
* Array of link headers |
|
*/ |
|
protected function generateMediaLinks(MediaInterface $media) { |
|
$media_type = $this->entityTypeManager->getStorage('media_type')->load($media->bundle()); |
|
|
|
$type_configuration = $media_type->get('source_configuration'); |
|
|
|
$links = []; |
|
|
|
$update_route_name = 'islandora.media_source_update'; |
|
$update_route_params = ['media' => $media->id()]; |
|
if ($this->accessManager->checkNamedRoute($update_route_name, $update_route_params, $this->account)) { |
|
$edit_media_url = Url::fromRoute($update_route_name, $update_route_params) |
|
->setAbsolute() |
|
->toString(); |
|
$links[] = "<$edit_media_url>; rel=\"edit-media\""; |
|
} |
|
|
|
if (!isset($type_configuration['source_field'])) { |
|
return $links; |
|
} |
|
$source_field = $type_configuration['source_field']; |
|
|
|
if (empty($source_field) || |
|
!$media->hasField($source_field) |
|
) { |
|
return $links; |
|
} |
|
|
|
// Collect file links for the media. |
|
foreach ($media->get($source_field)->referencedEntities() as $referencedEntity) { |
|
if ($referencedEntity->access('view')) { |
|
$file_url = $this->utils->getDownloadUrl($referencedEntity); |
|
$links[] = "<$file_url>; rel=\"describes\"; type=\"{$referencedEntity->getMimeType()}\""; |
|
} |
|
} |
|
|
|
return $links; |
|
} |
|
|
|
}
|
|
|