MediaRevisionAccessCheck.php in Media Revisions UI 8
File
src/Access/MediaRevisionAccessCheck.php
View source
<?php
namespace Drupal\media_revisions_ui\Access;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\media\MediaInterface;
use Symfony\Component\Routing\Route;
use Drupal\media\Access\MediaRevisionAccessCheck as CoreMediaRevisionAccessCheck;
class MediaRevisionAccessCheck extends CoreMediaRevisionAccessCheck {
protected $entityTypeManager;
public function __construct(EntityTypeManagerInterface $entity_type_manager) {
parent::__construct($entity_type_manager);
$this->entityTypeManager = $entity_type_manager;
}
public function access(Route $route, AccountInterface $account, $media_revision = NULL, MediaInterface $media = NULL) {
if ($media_revision) {
$media = $this->mediaStorage
->loadRevision($media_revision);
}
return parent::access($route, $account, $media_revision, $media)
->addCacheTags([
'media:' . $media
->id() . ':revisions_list',
]);
}
public function checkAccess(MediaInterface $media, AccountInterface $account, $op = 'view') {
$bundle = $media
->bundle();
$operations = [
'view' => 'view all media revisions',
'update' => 'revert all media revisions',
'delete' => 'delete all media revisions',
];
$bundleOperations = [
'view' => "view {$bundle} media revisions",
'update' => "revert {$bundle} media revisions",
'delete' => "delete {$bundle} media revisions",
];
if (!$media || !isset($operations[$op]) || !isset($bundleOperations[$op])) {
return FALSE;
}
$langcode = $media
->language()
->getId();
$cid = $media
->getRevisionId() . ':' . $langcode . ':' . $account
->id() . ':' . $op;
if (!isset($this->access[$cid])) {
if (!$account
->hasPermission($operations[$op]) && !$account
->hasPermission($bundleOperations[$op]) && !$account
->hasPermission('administer media')) {
$this->access[$cid] = FALSE;
return FALSE;
}
$mediaType = $media
->getEntityType()
->getBundleEntityType();
$mediaTypeEntity = $this->entityTypeManager
->getStorage($mediaType)
->load($media
->bundle());
if ($mediaTypeEntity
->shouldCreateNewRevision() && $op === 'view') {
$this->access[$cid] = TRUE;
}
else {
if ($media
->isDefaultRevision() && ($this
->countDefaultLanguageRevisions($media) == 1 || $op === 'update' || $op === 'delete')) {
$this->access[$cid] = FALSE;
}
elseif ($account
->hasPermission('administer media')) {
$this->access[$cid] = TRUE;
}
else {
$this->access[$cid] = $this->mediaAccess
->access($this->mediaStorage
->load($media
->id()), $op, $account) && ($media
->isDefaultRevision() || $this->mediaAccess
->access($media, $op, $account));
}
}
}
return $this->access[$cid];
}
}