activitypub-1.0.x-dev/src/EventSubscriber/SchedulerNodeSubscriber.php
src/EventSubscriber/SchedulerNodeSubscriber.php
<?php
namespace Drupal\activitypub\EventSubscriber;
use Drupal\activitypub\Entity\ActivityPubActivityInterface;
use Drupal\activitypub\Services\ActivityPubProcessClientInterface;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\scheduler\Event\SchedulerNodeEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Scheduler Node subscriber.
*/
class SchedulerNodeSubscriber implements EventSubscriberInterface {
/**
* The ActivityPub Activity storage.
*
* @var \Drupal\activitypub\Entity\Storage\ActivityPubActivityStorageInterface
*/
protected $activityStorage;
/**
* The process client.
*
* @var \Drupal\activitypub\Services\ActivityPubProcessClientInterface
*/
protected $activityPubProcessClient;
/**
* SchedulerNodeSubscriber constructor
*
* @param \Drupal\activitypub\Services\ActivityPubProcessClientInterface $activitypub_process_client
* The ActivityPub process client service.
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager service.
*
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
public function __construct(ActivityPubProcessClientInterface $activitypub_process_client, EntityTypeManagerInterface $entity_type_manager) {
$this->activityStorage = $entity_type_manager->getStorage('activitypub_activity');
$this->activityPubProcessClient = $activitypub_process_client;
}
/**
* Queue to activity outbox on publish, if any.
*
* @param $event
* The scheduler event.
*/
public function onSchedulerNodePublish($event) {
$entity = $event->getEntity();
$conditions = [
'collection' => ActivityPubActivityInterface::OUTBOX,
'entity_id' => $entity->id(),
'entity_type_id' => 'node',
'status' => 0
];
foreach ($this->activityStorage->getActivities($conditions) as $activity) {
$activity->setPublished();
$this->activityPubProcessClient->createQueueItem($activity);
}
Cache::invalidateTags(['user:' . $entity->getOwnerId()]);
}
/**
* Unpublish activities, if any.
*
* @param $event
* The scheduler event.
*/
public function onSchedulerNodeUnpublish($event) {
$entity = $event->getEntity();
$conditions = [
'collection' => ActivityPubActivityInterface::OUTBOX,
'entity_id' => $entity->id(),
'entity_type_id' => 'node',
'status' => 1
];
foreach ($this->activityStorage->getActivities($conditions) as $activity) {
try {
$activity->setUnpublished()->save();
}
catch (\Exception $ignored) {}
}
Cache::invalidateTags(['user:' . $entity->getOwnerId()]);
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents(): array {
if (class_exists('Drupal\scheduler\Event\SchedulerNodeEvents')) {
$events[SchedulerNodeEvents::PUBLISH][] = ['onSchedulerNodePublish', 10];
$events[SchedulerNodeEvents::UNPUBLISH][] = ['onSchedulerNodeUnpublish', 10];
return $events;
}
return [];
}
}
