View source
<?php
namespace Drupal\node_revisions_autoclean\Services;
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityStorageException;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Queue\QueueFactory;
use Drupal\node\Entity\Node;
use Drupal\node\NodeInterface;
class RevisionsManager {
protected $entityTypeManager;
protected $queueFactory;
protected $database;
protected $languageManager;
public function __construct(EntityTypeManagerInterface $entity_type_manager, QueueFactory $queueFactory, Connection $database, LanguageManagerInterface $languageManager) {
$this->entityTypeManager = $entity_type_manager;
$this->queueFactory = $queueFactory;
$this->database = $database;
$this->languageManager = $languageManager;
}
public function loadRevisions(Node $entity, $langcode = NULL) {
$vids = $this
->revisionIds($entity, $langcode);
$revisions = [];
foreach ($vids as $vid) {
$revisions[] = $this->entityTypeManager
->getStorage('node')
->loadRevision($vid);
}
return $revisions;
}
public function revisionIds(NodeInterface $node, $langcode = NULL) {
if (isset($langcode)) {
return $this->database
->query('SELECT vid FROM {node_revision} WHERE nid=:nid AND langcode=:langcode ORDER BY vid', [
':nid' => $node
->id(),
':langcode' => $langcode,
])
->fetchCol();
}
else {
return $this->database
->query('SELECT vid FROM {node_revision} WHERE nid=:nid ORDER BY vid', [
':nid' => $node
->id(),
])
->fetchCol();
}
}
public function revisionsToDelete(Node $node, array $revisions = []) {
$settings = \Drupal::config('node_revisions_autoclean.settings');
$max = $settings
->get('node.' . $node
->bundle());
$szDi = $settings
->get('interval.' . $node
->bundle());
$minDate = FALSE;
try {
$di = new \DateInterval($szDi);
$minDate = new \DateTime('now', new \DateTimeZone('UTC'));
$minDate
->sub($di);
} catch (\Exception $exc) {
}
$ret = [];
if ($max != '-1') {
$select = $this->database
->select('node_revision', 'nr');
$select
->join('node_field_revision', 'nfr', 'nfr.vid = nr.vid');
$select
->fields('nr', [
'vid',
'langcode',
'revision_timestamp',
]);
$select
->addField('nfr', 'status');
$select
->condition('nr.nid', $node
->id());
$select
->orderBy('nr.langcode', 'DESC');
$select
->orderBy('nr.vid', 'DESC');
$result = $select
->execute();
$resultSet = $result
->fetchAll();
$languages = $this->languageManager
->getLanguages();
foreach ($languages as $language) {
$revisionLanguage = array_filter($resultSet, function ($item) use ($language) {
return $item->langcode === $language
->getId();
});
$count = 0;
$bStart = FALSE;
foreach ($revisionLanguage as $revision) {
if ($bStart) {
$count++;
}
if ($revision->status) {
$bStart = TRUE;
}
if ($minDate && $minDate instanceof \DateTime && $count > $max) {
if ($revision->revision_timestamp < $minDate
->getTimestamp()) {
$ret[] = $revision->vid;
}
}
elseif ($count > $max) {
$ret[] = $revision->vid;
}
}
}
}
return $ret;
}
public function deleteRevision($revisionID) {
$this
->deleteRevisions([
$revisionID,
]);
}
public function deleteRevisions(array $revisionsIDs) {
foreach ($revisionsIDs as $revisionID) {
try {
$this->entityTypeManager
->getStorage('node')
->deleteRevision($revisionID);
} catch (EntityStorageException $e) {
watchdog_exception('node_revisions_autoclean', $e);
}
}
}
public function queueNodeForCronJob(Node $node) {
$queue = $this->queueFactory
->get('cleanup_revisions_worker');
$queue
->createItem((object) [
'node' => $node,
]);
}
}