activitypub-1.0.x-dev/src/Services/ActivityPubOutbox.php
src/Services/ActivityPubOutbox.php
<?php
namespace Drupal\activitypub\Services;
use Drupal\activitypub\Entity\ActivityPubActivityInterface;
use Drupal\activitypub\Entity\ActivityPubActorInterface;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
class ActivityPubOutbox implements ActivityPubOutboxInterface {
/**
* The ActivityPub actor storage.
*
* @var \Drupal\activitypub\Entity\Storage\ActivityPubActorStorageInterface
*/
protected $actorStorage;
/**
* The ActivityPub type storage.
*
* @var \Drupal\Core\Config\Entity\ConfigEntityStorageInterface
*/
protected $typeStorage;
/**
* The ActivityPub Activity storage.
*
* @var \Drupal\activitypub\Entity\Storage\ActivityPubActivityStorageInterface
*/
protected $activityStorage;
/**
* The ActivityPub utility service.
*
* @var \Drupal\activitypub\Services\ActivityPubUtilityInterface
*/
protected $activityPubUtility;
/**
* The process client.
*
* @var \Drupal\activitypub\Services\ActivityPubProcessClientInterface
*/
protected $activityPubProcessClient;
/**
* ActivityPubOutbox constructor
*
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager.
* @param \Drupal\activitypub\Services\ActivityPubUtilityInterface $activitypub_utility
* The ActivityPub utility service.
* @param \Drupal\activitypub\Services\ActivityPubProcessClientInterface $activitypub_process_client
* The ActivityPub process client service.
*
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
public function __construct(EntityTypeManagerInterface $entity_type_manager, ActivityPubUtilityInterface $activitypub_utility, ActivityPubProcessClientInterface $activitypub_process_client) {
$this->actorStorage = $entity_type_manager->getStorage('activitypub_actor');
$this->typeStorage = $entity_type_manager->getStorage('activitypub_type');
$this->activityStorage = $entity_type_manager->getStorage('activitypub_activity');
$this->activityPubUtility = $activitypub_utility;
$this->activityPubProcessClient = $activitypub_process_client;
}
/**
* {@inheritdoc}
*/
public function createActivity(string $type, EntityInterface $entity, ActivityPubActorInterface $actor, int $visibility = ActivityPubActivityInterface::VISIBILITY_PUBLIC, string $to = '') {
/** @var \Drupal\activitypub\Entity\ActivityPubTypeInterface $activityPubType */
$activityPubType = $this->typeStorage->load($type);
if (!$activityPubType) {
return;
}
$uid = $actor->getOwnerId();
$values = [
'collection' => 'outbox',
'config_id' => $type,
'type' => $activityPubType->getPlugin()['configuration']['activity'],
'uid' => $uid,
'actor' => $this->activityPubUtility->getActivityPubID($actor),
'entity_type_id' => $entity->getEntityTypeId(),
'entity_id' => $entity->id(),
'processed' => FALSE,
'status' => TRUE,
'visibility' => $visibility
];
if ($to) {
$values['to'] = $to;
}
/** @var \Drupal\activitypub\Entity\ActivityPubActivityInterface $activity */
$activity = $this->activityStorage->create($values);
$doSave = TRUE;
$activity->preOutboxSave($entity, $activityPubType, $doSave);
if ($doSave) {
$activity->save();
if ($activity->isPublished()) {
$this->activityPubProcessClient->createQueueItem($activity);
Cache::invalidateTags(['user:' . $uid]);
}
}
}
/**
* {@inheritdoc}
*/
public function updateActivity(ActivityPubActivityInterface $activity) {
if ($activity->isPublished()) {
$this->activityPubProcessClient->createQueueItem($activity, ACTIVITYPUB_OUTBOX_QUEUE, ['replaceType' => 'Update']);
Cache::invalidateTags(['user:' . $activity->getOwnerId()]);
}
}
}
