Skip to content
Snippets Groups Projects
Commit b13dae8b authored by catch's avatar catch
Browse files

Issue #3216107 by amateescu, adriancid, alexpott, Fabianx: Workspace...

Issue #3216107 by amateescu, adriancid, alexpott, Fabianx: Workspace association data is not updated when an entity is deleted
parent 231e7718
No related branches found
No related tags found
32 merge requests!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!54479.5.x SF update,!5014Issue #3071143: Table Render Array Example Is Incorrect,!4868Issue #1428520: Improve menu parent link selection,!4289Issue #1344552 by marcingy, Niklas Fiekas, Ravi.J, aleevas, Eduardo Morales...,!4114Issue #2707291: Disable body-level scrolling when a dialog is open as a modal,!4100Issue #3249600: Add support for PHP 8.1 Enums as allowed values for list_* data types,!3630Issue #2815301 by Chi, DanielVeza, kostyashupenko, smustgrave: Allow to create...,!3600Issue #3344629: Passing null to parameter #1 ($haystack) of type string is deprecated,!3291Issue #3336463: Rewrite rules for gzipped CSS and JavaScript aggregates never match,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2334Issue #3228209: Add hasRole() method to AccountInterface,!2074Issue #2707689: NodeForm::actions() checks for delete access on new entities,!2062Issue #3246454: Add weekly granularity to views date sort,!1591Issue #3199697: Add JSON:API Translation experimental module,!1484Exposed filters get values from URL when Ajax is on,!1255Issue #3238922: Refactor (if feasible) uses of the jQuery serialize function to use vanillaJS,!1162Issue #3100350: Unable to save '/' root path alias,!1105Issue #3025039: New non translatable field on translatable content throws error,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!957Added throwing of InvalidPluginDefinitionException from getDefinition().,!925Issue #2339235: Remove taxonomy hard dependency on node module,!877Issue #2708101: Default value for link text is not saved,!872Draft: Issue #3221319: Race condition when creating menu links and editing content deletes menu links,!844Resolve #3036010 "Updaters",!617Issue #3043725: Provide a Entity Handler for user cancelation,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493,!485Sets the autocomplete attribute for username/password input field on login form.,!30Issue #3182188: Updates composer usage to point at ./vendor/bin/composer
......@@ -214,16 +214,31 @@ public function postPublish(WorkspaceInterface $workspace) {
/**
* {@inheritdoc}
*/
public function deleteAssociations($workspace_id, $entity_type_id = NULL, $entity_ids = NULL) {
$query = $this->database->delete(static::TABLE)
->condition('workspace', $workspace_id);
public function deleteAssociations($workspace_id = NULL, $entity_type_id = NULL, $entity_ids = NULL, $revision_ids = NULL) {
if (!$workspace_id && !$entity_type_id) {
throw new \InvalidArgumentException('A workspace ID or an entity type ID must be provided.');
}
$query = $this->database->delete(static::TABLE);
if ($workspace_id) {
$query->condition('workspace', $workspace_id);
}
if ($entity_type_id) {
if (!$entity_ids && !$revision_ids) {
throw new \InvalidArgumentException('A list of entity IDs or revision IDs must be provided for an entity type.');
}
$query->condition('target_entity_type_id', $entity_type_id, '=');
if ($entity_ids) {
$query->condition('target_entity_id', $entity_ids, 'IN');
}
if ($revision_ids) {
$query->condition('target_entity_revision_id', $revision_ids, 'IN');
}
}
$query->execute();
......
......@@ -97,16 +97,22 @@ public function postPublish(WorkspaceInterface $workspace);
/**
* Deletes all the workspace association records for the given workspace.
*
* @param string $workspace_id
* A workspace entity ID.
* @param string|null $workspace_id
* (optional) A workspace entity ID. Defaults to NULL.
* @param string|null $entity_type_id
* (optional) The target entity type of the associations to delete. Defaults
* to NULL.
* @param int[]|string[]|null $entity_ids
* (optional) The target entity IDs of the associations to delete. Defaults
* to NULL.
* @param int[]|string[]|null $revision_ids
* (optional) The target entity revision IDs of the associations to delete.
* Defaults to NULL.
*
* @throws \InvalidArgumentException
* If neither $workspace_id nor $entity_type_id arguments were provided.
*/
public function deleteAssociations($workspace_id, $entity_type_id = NULL, $entity_ids = NULL);
public function deleteAssociations($workspace_id = NULL, $entity_type_id = NULL, $entity_ids = NULL, $revision_ids = NULL);
/**
* Initializes a workspace with all the associations of its parent.
......
......@@ -367,6 +367,55 @@ public function testWorkspaces() {
$this->assertEmpty($workspace_publisher->getDifferringRevisionIdsOnSource());
}
/**
* Tests the workspace association data integrity for entity CRUD operations.
*
* @covers ::workspaces_entity_presave
* @covers ::workspaces_entity_insert
* @covers ::workspaces_entity_delete
* @covers ::workspaces_entity_revision_delete
*/
public function testWorkspaceAssociationDataIntegrity() {
$this->initializeWorkspacesModule();
// Check the initial empty state.
$expected_workspace_association = ['stage' => []];
$this->assertWorkspaceAssociation($expected_workspace_association, 'node');
// Add a new unpublished node in 'stage' and check that new revision is
// tracked in the workspace association data.
$this->switchToWorkspace('stage');
$unpublished_node = $this->createNode(['title' => 'stage - 3 - r3 - unpublished', 'created' => $this->createdTimestamp++, 'status' => FALSE]);
$expected_workspace_association = ['stage' => [3]];
$this->assertWorkspaceAssociation($expected_workspace_association, 'node');
// Add a new revision for the unpublished node.
$unpublished_node->title = 'stage - 3 - r4 - unpublished';
$unpublished_node->save();
$expected_workspace_association = ['stage' => [4]];
$this->assertWorkspaceAssociation($expected_workspace_association, 'node');
// Delete the unpublished node and check that the association data has been
// updated.
$unpublished_node->delete();
$expected_workspace_association = ['stage' => []];
$this->assertWorkspaceAssociation($expected_workspace_association, 'node');
// Add a new published node in 'stage' and check that new workspace-specific
// revision is tracked in the workspace association data. Note that revision
// '5' has been created as an unpublished default revision in Live, so it is
// not tracked.
$this->createNode(['title' => 'stage - 4 - r6 - published', 'created' => $this->createdTimestamp++, 'status' => TRUE]);
$expected_workspace_association = ['stage' => [6]];
$this->assertWorkspaceAssociation($expected_workspace_association, 'node');
// Delete revision '6' and check that the workspace association does not
// track it anymore.
$this->entityTypeManager->getStorage('node')->deleteRevision(6);
$expected_workspace_association = ['stage' => []];
$this->assertWorkspaceAssociation($expected_workspace_association, 'node');
}
/**
* Tests entity tracking in workspace descendants.
*/
......
......@@ -143,6 +143,26 @@ function workspaces_entity_predelete(EntityInterface $entity) {
->entityPredelete($entity);
}
/**
* Implements hook_entity_delete().
*/
function workspaces_entity_delete(EntityInterface $entity) {
if (\Drupal::service('workspaces.manager')->isEntityTypeSupported($entity->getEntityType())) {
\Drupal::service('workspaces.association')
->deleteAssociations(NULL, $entity->getEntityTypeId(), [$entity->id()]);
}
}
/**
* Implements hook_entity_revision_delete().
*/
function workspaces_entity_revision_delete(EntityInterface $entity) {
if (\Drupal::service('workspaces.manager')->isEntityTypeSupported($entity->getEntityType())) {
\Drupal::service('workspaces.association')
->deleteAssociations(NULL, $entity->getEntityTypeId(), [$entity->id()], [$entity->getRevisionId()]);
}
}
/**
* Implements hook_entity_access().
*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment