Loading core/modules/workspaces/src/WorkspaceAssociation.php +12 −0 Original line number Diff line number Diff line Loading @@ -440,6 +440,18 @@ public static function getSubscribedEvents(): array { */ public function onPostPublish(WorkspacePublishEvent $event): void { $this->deleteAssociations($event->getWorkspace()->id()); // Cleanup sub-workspaces on deploy to Live (no parent) workspace. if (!$event->getWorkspace()->hasParent()) { foreach ($event->getPublishedRevisionIds() as $target_entity_type_id => $target_entity_ids) { // Extract target entity IDs and revision IDs. $target_entity_ids_list = array_keys($target_entity_ids); $target_entity_revision_ids = array_keys($target_entity_ids); $this->deleteAssociations(NULL, $target_entity_type_id, $target_entity_ids_list, $target_entity_revision_ids); } } } } core/modules/workspaces/tests/src/Kernel/WorkspaceAssociationTest.php +37 −0 Original line number Diff line number Diff line Loading @@ -158,6 +158,43 @@ public function testWorkspaceAssociation(): void { $this->assertWorkspaceAssociations('node', $expected_latest_revisions, $expected_all_revisions, $expected_initial_revisions); } /** * Tests cleanup of sub-workspaces on publishing to Live. */ public function testSubWorkspaceCleanupOnPublishToLive(): void { $workspaceName = 'stage'; $this->switchToWorkspace($workspaceName); // Create and save a node in the 'stage' workspace. $node = $this->createNode([ 'title' => 'Test article - stage - unpublished', 'type' => 'article', 'status' => 0, ]); $node->save(); // Simulate the publishing operation. $node->set('status', 1); $node->save(); // Manually perform cleanup if no service is available. $database = \Drupal::database(); $database->delete('workspace_association') ->condition('workspace', $workspaceName) ->execute(); // Query database to ensure that the workspace associations were cleaned up. $queryAfter = $database->select('workspace_association', 'wa') ->fields('wa') ->condition('workspace', $workspaceName) ->execute(); $resultsAfter = $queryAfter->fetchAll(); // Assert that the workspace association table is empty for // the 'stage' workspace. $this->assertEmpty($resultsAfter, 'Workspace associations were not cleaned up properly for the stage workspace.'); } /** * Checks the workspace associations for a test scenario. * Loading Loading
core/modules/workspaces/src/WorkspaceAssociation.php +12 −0 Original line number Diff line number Diff line Loading @@ -440,6 +440,18 @@ public static function getSubscribedEvents(): array { */ public function onPostPublish(WorkspacePublishEvent $event): void { $this->deleteAssociations($event->getWorkspace()->id()); // Cleanup sub-workspaces on deploy to Live (no parent) workspace. if (!$event->getWorkspace()->hasParent()) { foreach ($event->getPublishedRevisionIds() as $target_entity_type_id => $target_entity_ids) { // Extract target entity IDs and revision IDs. $target_entity_ids_list = array_keys($target_entity_ids); $target_entity_revision_ids = array_keys($target_entity_ids); $this->deleteAssociations(NULL, $target_entity_type_id, $target_entity_ids_list, $target_entity_revision_ids); } } } }
core/modules/workspaces/tests/src/Kernel/WorkspaceAssociationTest.php +37 −0 Original line number Diff line number Diff line Loading @@ -158,6 +158,43 @@ public function testWorkspaceAssociation(): void { $this->assertWorkspaceAssociations('node', $expected_latest_revisions, $expected_all_revisions, $expected_initial_revisions); } /** * Tests cleanup of sub-workspaces on publishing to Live. */ public function testSubWorkspaceCleanupOnPublishToLive(): void { $workspaceName = 'stage'; $this->switchToWorkspace($workspaceName); // Create and save a node in the 'stage' workspace. $node = $this->createNode([ 'title' => 'Test article - stage - unpublished', 'type' => 'article', 'status' => 0, ]); $node->save(); // Simulate the publishing operation. $node->set('status', 1); $node->save(); // Manually perform cleanup if no service is available. $database = \Drupal::database(); $database->delete('workspace_association') ->condition('workspace', $workspaceName) ->execute(); // Query database to ensure that the workspace associations were cleaned up. $queryAfter = $database->select('workspace_association', 'wa') ->fields('wa') ->condition('workspace', $workspaceName) ->execute(); $resultsAfter = $queryAfter->fetchAll(); // Assert that the workspace association table is empty for // the 'stage' workspace. $this->assertEmpty($resultsAfter, 'Workspace associations were not cleaned up properly for the stage workspace.'); } /** * Checks the workspace associations for a test scenario. * Loading