danse_moderation_notifications-1.0.x-dev/src/NotificationInformation.php
src/NotificationInformation.php
<?php
namespace Drupal\danse_moderation_notifications;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\content_moderation\ModerationInformationInterface;
use Drupal\Core\Entity\RevisionableStorageInterface;
/**
* Service for notification related questions about the moderated entity.
*/
class NotificationInformation implements NotificationInformationInterface {
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* General service for moderation-related questions about Entity API.
*
* @var \Drupal\content_moderation\ModerationInformation
*/
protected $moderationInformation;
/**
* Creates a new NotificationInformation instance.
*
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager.
* @param \Drupal\content_moderation\ModerationInformationInterface $moderation_information
* The bundle information service.
*/
public function __construct(EntityTypeManagerInterface $entity_type_manager, ModerationInformationInterface $moderation_information) {
$this->entityTypeManager = $entity_type_manager;
$this->moderationInformation = $moderation_information;
}
/**
* {@inheritdoc}
*/
public function isModeratedEntity(EntityInterface $entity) {
return $this->moderationInformation->isModeratedEntity($entity);
}
/**
* {@inheritdoc}
*/
public function getPreviousState(ContentEntityInterface $entity) {
$previous_state = FALSE;
$workflow = $this->getWorkflow($entity);
if (isset($entity->last_revision) && !empty($entity->last_revision)) {
$revision_id = $entity->last_revision;
/** @var \Drupal\node\Entity\Node $last_revision */
$last_revision = \Drupal::entityTypeManager()->getStorage('node')->loadRevision($revision_id);
$previous_state = $last_revision->get('moderation_state')->getString();
}
if (!$previous_state) {
$previous_state = $workflow->getTypePlugin()->getInitialState($entity)->id();
}
return $previous_state;
}
/**
* {@inheritdoc}
*/
public function getWorkflow(ContentEntityInterface $entity) {
return $this->isModeratedEntity($entity) ? $this->moderationInformation
->getWorkflowForEntity($entity) : FALSE;
}
/**
* {@inheritdoc}
*/
public function getTransition(ContentEntityInterface $entity) {
$transition = FALSE;
if (($workflow = $this->getWorkflow($entity))) {
$current_state = $entity->moderation_state->value;
$previous_state = $this->getPreviousState($entity);
try {
$transition = $workflow->getTypePlugin()->getTransitionFromStateToState($previous_state, $current_state);
}
catch (\InvalidArgumentException $e) {
// There is no available transition. Fall through to return FALSE.
}
}
return $transition;
}
/**
* {@inheritdoc}
*/
public function getNotifications(EntityInterface $entity) {
$notifications = [];
if ($this->isModeratedEntity($entity)) {
$workflow = $this->getWorkflow($entity);
if ($transition = $this->getTransition($entity)) {
// Find out if we have a config entity that contains this transition.
$query = $this->entityTypeManager->getStorage('danse_moderation_notifications')
->getQuery()
->condition('workflow', $workflow->id())
->condition('status', 1)
->condition('transitions.' . $transition->id(), $transition->id());
$notification_ids = $query->execute();
$notifications = $this->entityTypeManager
->getStorage('danse_moderation_notifications')
->loadMultiple($notification_ids);
}
}
return $notifications;
}
/**
* {@inheritdoc}
*/
public function getLatestRevision($entity_type_id, $entity_id) {
$storage = $this->entityTypeManager->getStorage($entity_type_id);
if ($storage instanceof RevisionableStorageInterface
&& $revision_id = $storage->getLatestRevisionId($entity_id)) {
return $storage->loadRevision($revision_id);
}
}
}
