ScheduledTransitionsUtility.php in Scheduled Transitions 8
File
src/ScheduledTransitionsUtility.php
View source
<?php
declare (strict_types=1);
namespace Drupal\scheduled_transitions;
use Drupal\content_moderation\ModerationInformationInterface;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\scheduled_transitions\Form\ScheduledTransitionsSettingsForm as SettingsForm;
class ScheduledTransitionsUtility implements ScheduledTransitionsUtilityInterface {
protected $configFactory;
protected $cache;
protected $entityTypeManager;
protected $bundleInfo;
protected $moderationInformation;
protected const CID_SCHEDULED_TRANSITIONS_BUNDLES = 'scheduled_transitions_enabled_bundles';
public function __construct(ConfigFactoryInterface $configFactory, CacheBackendInterface $cache, EntityTypeManagerInterface $entityTypeManager, EntityTypeBundleInfoInterface $bundleInfo, ModerationInformationInterface $moderationInformation) {
$this->configFactory = $configFactory;
$this->cache = $cache;
$this->entityTypeManager = $entityTypeManager;
$this->bundleInfo = $bundleInfo;
$this->moderationInformation = $moderationInformation;
}
public function getTransitions(EntityInterface $entity) : array {
$transitionStorage = $this->entityTypeManager
->getStorage('scheduled_transition');
$ids = $transitionStorage
->getQuery()
->condition('entity__target_type', $entity
->getEntityTypeId())
->condition('entity__target_id', $entity
->id())
->execute();
return $transitionStorage
->loadMultiple($ids);
}
public function getApplicableBundles() : array {
$bundles = [];
$bundleInfo = $this->bundleInfo
->getAllBundleInfo();
foreach ($bundleInfo as $entityTypeId => $entityTypeBundles) {
$entityType = $this->entityTypeManager
->getDefinition($entityTypeId);
$entityTypeBundles = array_filter($entityTypeBundles, function ($bundleId) use ($entityType) : bool {
return $this->moderationInformation
->shouldModerateEntitiesOfBundle($entityType, $bundleId);
}, \ARRAY_FILTER_USE_KEY);
$bundles[$entityTypeId] = array_keys($entityTypeBundles);
}
return array_filter($bundles);
}
public function getBundles() : array {
$enabledBundlesCache = $this->cache
->get(static::CID_SCHEDULED_TRANSITIONS_BUNDLES);
if ($enabledBundlesCache !== FALSE) {
return $enabledBundlesCache->data ?? [];
}
$enabledBundles = $this->configFactory
->get('scheduled_transitions.settings')
->get('bundles');
$enabledBundles = array_map(function (array $bundleConfig) {
return sprintf('%s:%s', $bundleConfig['entity_type'], $bundleConfig['bundle']);
}, is_array($enabledBundles) ? $enabledBundles : []);
$applicableBundles = $this
->getApplicableBundles();
foreach ($applicableBundles as $entityTypeId => &$bundles) {
$bundles = array_filter($bundles, function (string $bundle) use ($entityTypeId, $enabledBundles) {
return in_array($entityTypeId . ':' . $bundle, $enabledBundles);
});
}
$applicableBundles = array_filter($applicableBundles);
$this->cache
->set(static::CID_SCHEDULED_TRANSITIONS_BUNDLES, $applicableBundles, Cache::PERMANENT, [
SettingsForm::SETTINGS_TAG,
]);
return $applicableBundles;
}
public static function createScheduledTransitionsCacheTag(EntityInterface $entity) : string {
return sprintf('scheduled_transitions_for:%s:%s', $entity
->getEntityTypeId(), $entity
->id());
}
}