You are here

config_entity_revisions.module in Config Entity Revisions 8.2

Config entity revisions procedural hooks.

File

config_entity_revisions.module
View source
<?php

/**
 * @file
 * Config entity revisions procedural hooks.
 */
use Drupal\config_entity_revisions\ConfigEntityRevisionsConfigEntityInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Entity\EntityPublishedInterface;
use Drupal\config_entity_revisions\Entity\Handler\ConfigEntityRevisionsRevisionStorageHandler;

/**
 * Implements hook_entity_access().
 *
 * Overrides content_moderation_entity_access, providing a version that handles
 * configuration entities with revisions as well.
 *
 * Entities should be viewable if unpublished and the user has the appropriate
 * permission. This permission is therefore effectively mandatory for any user
 * that wants to moderate things.
 */
function config_entity_revisions_entity_access(EntityInterface $entity, $operation, AccountInterface $account) {

  /** @var \Drupal\content_moderation\ModerationInformationInterface $moderation_info */
  $moderation_info = Drupal::service('content_moderation.moderation_information');
  $access_result = NULL;
  if ($operation === 'view') {
    $access_result = $entity instanceof EntityPublishedInterface && !$entity
      ->isPublished() ? AccessResult::allowedIfHasPermission($account, 'view any unpublished content') : AccessResult::neutral();
    $access_result
      ->addCacheableDependency($entity);
  }
  elseif ($operation === 'update' && $moderation_info
    ->isModeratedEntity($entity) && $entity->moderation_state) {

    /** @var \Drupal\content_moderation\StateTransitionValidation $transition_validation */
    $transition_validation = \Drupal::service('content_moderation.state_transition_validation');
    if ($entity instanceof ConfigEntityRevisionsConfigEntityInterface) {
      $entity = $entity
        ->getContentEntity();
    }
    $valid_transition_targets = $transition_validation
      ->getValidTransitions($entity, $account);
    $access_result = $valid_transition_targets ? AccessResult::neutral() : AccessResult::forbidden('No valid transitions exist for given account.');
    $access_result
      ->addCacheableDependency($entity);
    $access_result
      ->addCacheableDependency($account);
    $workflow = $moderation_info
      ->getWorkflowForEntity($entity);
    $access_result
      ->addCacheableDependency($workflow);
    foreach ($valid_transition_targets as $valid_transition_target) {
      $access_result
        ->addCacheableDependency($valid_transition_target);
    }
  }
  return $access_result;
}

/**
 * Implements hook_module_implements_alter().
 *
 * Remove the content moderation hook, which will choke on a config entity. We
 * implement a more generic version above.
 */
function config_entity_revisions_module_implements_alter(&$implementations, $hook) {
  if ($hook !== 'entity_access') {
    return;
  }
  unset($implementations['content_moderation']);
}

/**
 * Implements hook_entity_delete().
 */
function config_entity_revisions_entity_delete(EntityInterface $entity) {
  if (!$entity instanceof ConfigEntityRevisionsConfigEntityInterface) {
    return;
  }
  $controller = ConfigEntityRevisionsRevisionStorageHandler::createInstance(\Drupal::getContainer(), $entity
    ->getContentEntity()
    ->getEntityType());
  $controller
    ->deleteRevisions($entity);
}