diff --git a/src/Entity/WorkspacePointer.php b/src/Entity/WorkspacePointer.php new file mode 100644 index 0000000..be50f30 --- /dev/null +++ b/src/Entity/WorkspacePointer.php @@ -0,0 +1,140 @@ +get('name')->value; + } + + /** + * {@inheritdoc} + */ + public function setName($name) { + $this->set('name', $name); + return $this; + } + + /** + * {@inheritdoc} + */ + public function getCreatedTime() { + return $this->get('created')->value; + } + + /** + * {@inheritdoc} + */ + public function setCreatedTime($timestamp) { + $this->set('created', $timestamp); + return $this; + } + + /** + * {@inheritdoc} + */ + public function setWorkspace(WorkspaceInterface $workspace) { + $this->set('workspace', $workspace->id()); + return $this; + } + + /** + * {@inheritdoc} + */ + public function setWorkspaceId($workspace_id) { + $this->set('workspace', $workspace_id); + return $this; + } + + /** + * {@inheritdoc} + */ + public function getWorkspace() { + $ws = $this->get('workspace')->entity; + return $ws; + } + + /** + * {@inheritdoc} + */ + public function getWorkspaceId() { + return $this->get('workspace')->target_id; + } + + /** + * {@inheritdoc} + */ + public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { + $fields['id'] = BaseFieldDefinition::create('integer') + ->setLabel(t('ID')) + ->setDescription(t('The ID of the Workspace pointer entity.')) + ->setReadOnly(TRUE); + $fields['uuid'] = BaseFieldDefinition::create('uuid') + ->setLabel(t('UUID')) + ->setDescription(t('The UUID of the Workspace pointer entity.')) + ->setReadOnly(TRUE); + + $fields['name'] = BaseFieldDefinition::create('string') + ->setLabel(t('Name')) + ->setDescription(t('The name of the Workspace pointer entity.')) + ->setSettings(array( + 'max_length' => 50, + 'text_processing' => 0, + )) + ->setDefaultValue('') + ->setDisplayConfigurable('form', FALSE) + ->setDisplayConfigurable('view', FALSE); + + $fields['created'] = BaseFieldDefinition::create('created') + ->setLabel(t('Created')) + ->setDescription(t('The time that the entity was created.')); + + $fields['changed'] = BaseFieldDefinition::create('changed') + ->setLabel(t('Changed')) + ->setDescription(t('The time that the entity was last edited.')); + + $fields['workspace'] = BaseFieldDefinition::create('entity_reference') + ->setLabel(t('Workspace')) + ->setDescription(t('A reference to the workspace')) + ->setSetting('target_type', 'workspace'); + + return $fields; + } + +} diff --git a/src/Entity/WorkspacePointerViewsData.php b/src/Entity/WorkspacePointerViewsData.php new file mode 100644 index 0000000..5f8438f --- /dev/null +++ b/src/Entity/WorkspacePointerViewsData.php @@ -0,0 +1,32 @@ + 'id', + 'title' => $this->t('Workspace pointer'), + 'help' => $this->t('The Workspace pointer ID.'), + ); + + return $data; + } + +} diff --git a/src/EventSubscriber/WorkbenchModerationSubscriber.php b/src/EventSubscriber/WorkbenchModerationSubscriber.php index ccb5015..c60d433 100644 --- a/src/EventSubscriber/WorkbenchModerationSubscriber.php +++ b/src/EventSubscriber/WorkbenchModerationSubscriber.php @@ -9,7 +9,7 @@ use Drupal\workbench_moderation\Event\WorkbenchModerationEvents; use Drupal\workbench_moderation\Event\WorkbenchModerationTransitionEvent; use Drupal\workspace\PointerInterface; use Drupal\workspace\ReplicatorManager; -use Drupal\workspace\WorkspacePointerInterface; +use Drupal\workspace\WorkspacePointerTrackerInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** @@ -23,18 +23,18 @@ class WorkbenchModerationSubscriber implements EventSubscriberInterface { protected $entityTypeManager; /** - * @var \Drupal\workspace\WorkspacePointerInterface + * @var \Drupal\workspace\WorkspacePointerTrackerInterface */ - protected $workspacePointer; + protected $workspacePointerTracker; /** * @var \Drupal\workspace\ReplicatorManager */ protected $replicatorManager; - public function __construct(EntityTypeManagerInterface $entity_type_manager, WorkspacePointerInterface $workspace_pointer, ReplicatorManager $replicator_manager) { + public function __construct(EntityTypeManagerInterface $entity_type_manager, WorkspacePointerTrackerInterface $workspace_pointer_tracker, ReplicatorManager $replicator_manager) { $this->entityTypeManager = $entity_type_manager; - $this->workspacePointer = $workspace_pointer; + $this->workspacePointerTracker = $workspace_pointer_tracker; $this->replicatorManager = $replicator_manager; } @@ -87,9 +87,9 @@ class WorkbenchModerationSubscriber implements EventSubscriberInterface { } /** @var PointerInterface $source_pointer */ - $source_pointer = $this->workspacePointer->get('workspace:' . $workspace->id()); + $source_pointer = $this->workspacePointerTracker->get('workspace:' . $workspace->id()); /** @var PointerInterface $target_pointer */ - $target_pointer = $this->workspacePointer->get('workspace:' . $parent_workspace->id()); + $target_pointer = $this->workspacePointerTracker->get('workspace:' . $parent_workspace->id()); $this->replicatorManager->replicate($source_pointer, $target_pointer); } diff --git a/src/Plugin/RulesAction/ReplicateContent.php b/src/Plugin/RulesAction/ReplicateContent.php index 37e60c8..e11e75c 100644 --- a/src/Plugin/RulesAction/ReplicateContent.php +++ b/src/Plugin/RulesAction/ReplicateContent.php @@ -15,7 +15,7 @@ use Drupal\multiversion\Workspace\WorkspaceManagerInterface; use Drupal\rules\Core\RulesActionBase; use Drupal\workspace\Pointer; use Drupal\workspace\ReplicatorManager; -use Drupal\workspace\WorkspacePointerInterface; +use Drupal\workspace\WorkspacePointerTrackerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -39,8 +39,8 @@ class ReplicateContent extends RulesActionBase implements ContainerFactoryPlugin /** @var WorkspaceManagerInterface */ protected $workspaceManager; - /** @var WorkspacePointerInterface */ - protected $workspacePointer; + /** @var WorkspacePointerTrackerInterface */ + protected $workspacePointerTracker; /** @var ReplicatorManager */ protected $replicatorManager; @@ -58,13 +58,13 @@ class ReplicateContent extends RulesActionBase implements ContainerFactoryPlugin * @param mixed $plugin_definition * The plugin implementation definition. * @param \Drupal\multiversion\Workspace\WorkspaceManagerInterface $workspace_manager - * @param \Drupal\workspace\WorkspacePointerInterface $workspace_pointer + * @param \Drupal\workspace\WorkspacePointerTrackerInterface $workspace_pointer_tracker * @param \Drupal\workspace\ReplicatorManager $replicator_manager */ - public function __construct(array $configuration, $plugin_id, $plugin_definition, WorkspaceManagerInterface $workspace_manager, WorkspacePointerInterface $workspace_pointer, ReplicatorManager $replicator_manager, MultiversionManagerInterface $multiversion_manager) { + public function __construct(array $configuration, $plugin_id, $plugin_definition, WorkspaceManagerInterface $workspace_manager, WorkspacePointerTrackerInterface $workspace_pointer_tracker, ReplicatorManager $replicator_manager, MultiversionManagerInterface $multiversion_manager) { parent::__construct($configuration, $plugin_id, $plugin_definition); $this->workspaceManager = $workspace_manager; - $this->workspacePointer = $workspace_pointer; + $this->workspacePointerTracker = $workspace_pointer_tracker; $this->replicatorManager = $replicator_manager; $this->multiversionManager = $multiversion_manager; } @@ -99,9 +99,9 @@ class ReplicateContent extends RulesActionBase implements ContainerFactoryPlugin /** @var Workspace $upstream */ $upstream = $workspace->get('upstream')->entity; /** @var Pointer $source */ - $source = $this->workspacePointer->get('workspace:' . $workspace->id()); + $source = $this->workspacePointerTracker->get('workspace:' . $workspace->id()); /** @var Pointer $target */ - $target = $this->workspacePointer->get('workspace:' . $upstream->id()); + $target = $this->workspacePointerTracker->get('workspace:' . $upstream->id()); $result = $this->replicatorManager->replicate($source, $target); if (!isset($result['error'])) { drupal_set_message($this->t('Content replicated from workspace @source to workspace @target', diff --git a/src/WorkspacePointer.php b/src/WorkspacePointer.php deleted file mode 100644 index 42cfa5c..0000000 --- a/src/WorkspacePointer.php +++ /dev/null @@ -1,54 +0,0 @@ -keyValueStore = $key_value_factory->get('workspace.pointer'); - } - - /** - * @inheritDoc - */ - public function get($key) { - return $this->keyValueStore->get($key); - } - - /** - * @inheritDoc - */ - public function getMultiple(array $keys = []) { - if (empty($keys)) { - return $this->keyValueStore->getAll(); - } - return $this->keyValueStore->getMultiple($keys); - } - - /** - * @inheritDoc - */ - public function add(Pointer $pointer) { - $this->keyValueStore->set($pointer->id(), $pointer); - } - - /** - * @inheritDoc - */ - public function addMultiple(array $pointers) { - foreach ($pointers as $pointer) { - $this->add($pointer); - } - } - -} \ No newline at end of file diff --git a/src/WorkspacePointerInterface.php b/src/WorkspacePointerInterface.php index 9ef7716..fb7c39e 100644 --- a/src/WorkspacePointerInterface.php +++ b/src/WorkspacePointerInterface.php @@ -1,32 +1,94 @@ keyValueStore = $key_value_factory->get('workspace.pointer'); + } + + /** + * @inheritDoc + */ + public function get($key) { + return $this->keyValueStore->get($key); + } + + /** + * @inheritDoc + */ + public function getMultiple(array $keys = []) { + if (empty($keys)) { + return $this->keyValueStore->getAll(); + } + return $this->keyValueStore->getMultiple($keys); + } + + /** + * @inheritDoc + */ + public function add(Pointer $pointer) { + $this->keyValueStore->set($pointer->id(), $pointer); + } + + /** + * @inheritDoc + */ + public function addMultiple(array $pointers) { + foreach ($pointers as $pointer) { + $this->add($pointer); + } + } + +} diff --git a/src/WorkspacePointerTrackerInterface.php b/src/WorkspacePointerTrackerInterface.php new file mode 100644 index 0000000..3c9ca86 --- /dev/null +++ b/src/WorkspacePointerTrackerInterface.php @@ -0,0 +1,32 @@ +installEntitySchema('workspace'); + $this->installEntitySchema('workspace_pointer'); + $this->installEntitySchema('user'); + } + + /** + * Creates a workspace type for testing purposes. + * + * @return WorkspaceType + */ + protected function createWorkspaceType() { + $workspace_type = WorkspaceType::create([ + 'id' => 'test', + 'label' => 'Workspace bundle', + ]); + $workspace_type->save(); + + return $workspace_type; + } + + /** + * Creates a workspace for testing purposes. + * + * @return WorkspaceInterface + */ + protected function createWorkspace() { + $workspace = Workspace::create([ + 'type' => 'test', + 'machine_name' => 'le_workspace', + 'label' => 'Le Workspace', + ]); + $workspace->save(); + + return $workspace; + } + + /** + * Verifies pointers can be created using an object as the reference. + */ + public function testCreationWithObject() { + $this->createWorkspaceType(); + + $workspace = $this->createWorkspace(); + + /** @var WorkspacePointer $pointer */ + $pointer = WorkspacePointer::create(); + $pointer->setWorkspace($workspace); + $pointer->save(); + + $id = $pointer->id(); + + $pointer = WorkspacePointer::load($id); + + $this->assertEquals($workspace->id(), $pointer->getWorkspaceId()); + $this->assertEquals($workspace->id(), $pointer->getWorkspace()->id()); + } + + /** + * Verifies pointers can be created using an ID as the reference. + */ + public function testCreationWithId() { + $this->createWorkspaceType(); + + $workspace = $this->createWorkspace(); + + /** @var WorkspacePointer $pointer */ + $pointer = WorkspacePointer::create(); + $pointer->setWorkspaceId($workspace->id()); + $pointer->save(); + + $id = $pointer->id(); + + $pointer = WorkspacePointer::load($id); + + $this->assertEquals($workspace->id(), $pointer->getWorkspaceId()); + $this->assertEquals($workspace->id(), $pointer->getWorkspace()->id()); + } +} diff --git a/workspace.info.yml b/workspace.info.yml index ed7468c..b50e2e4 100644 --- a/workspace.info.yml +++ b/workspace.info.yml @@ -5,4 +5,5 @@ core: 8.x dependencies: - options - datetime - - multiversion \ No newline at end of file + - multiversion + - dynamic_entity_reference diff --git a/workspace.links.action.yml b/workspace.links.action.yml index b2c6971..4bd599b 100644 --- a/workspace.links.action.yml +++ b/workspace.links.action.yml @@ -7,4 +7,4 @@ entity.workspace_type.add_form: route_name: 'entity.workspace_type.add_form' title: 'Add Workspace type' appears_on: - - entity.workspace_type.collection \ No newline at end of file + - entity.workspace_type.collection diff --git a/workspace.links.task.yml b/workspace.links.task.yml index e7a8e84..e6f8cc2 100644 --- a/workspace.links.task.yml +++ b/workspace.links.task.yml @@ -16,4 +16,4 @@ entity.workspace_type.edit_form: route_name: entity.workspace_type.edit_form base_route: entity.workspace_type.edit_form workspace.revisions: - deriver: '\Drupal\workspace\Plugin\Derivative\RevisionsLocalTask' \ No newline at end of file + deriver: '\Drupal\workspace\Plugin\Derivative\RevisionsLocalTask' diff --git a/workspace.routing.yml b/workspace.routing.yml index 1f27918..b3b197d 100644 --- a/workspace.routing.yml +++ b/workspace.routing.yml @@ -56,4 +56,4 @@ entity.workspace_type.add_form: requirements: _permission: 'administer site configuration' options: - _admin_route: TRUE \ No newline at end of file + _admin_route: TRUE diff --git a/workspace.services.yml b/workspace.services.yml index abd2928..15d86ff 100644 --- a/workspace.services.yml +++ b/workspace.services.yml @@ -9,7 +9,7 @@ services: tags: - {name: workspace_replicator, priority: 10} workspace.pointer: - class: Drupal\workspace\WorkspacePointer + class: Drupal\workspace\WorkspacePointerTracker arguments: ['@keyvalue'] workspace.entity_type_alter: class: Drupal\workspace\EntityTypeAlter @@ -31,4 +31,4 @@ services: class: Drupal\workspace\EventSubscriber\WorkbenchModerationSubscriber arguments: ['@entity_type.manager', '@workspace.pointer', '@workspace.replicator_manager'] tags: - - { name: event_subscriber } \ No newline at end of file + - { name: event_subscriber }