function WorkspaceManager::purgeDeletedWorkspacesBatch

Same name and namespace in other branches
  1. 9 core/modules/workspaces/src/WorkspaceManager.php \Drupal\workspaces\WorkspaceManager::purgeDeletedWorkspacesBatch()
  2. 8.9.x core/modules/workspaces/src/WorkspaceManager.php \Drupal\workspaces\WorkspaceManager::purgeDeletedWorkspacesBatch()
  3. 11.x core/modules/workspaces/src/WorkspaceManager.php \Drupal\workspaces\WorkspaceManager::purgeDeletedWorkspacesBatch()

Deletes the revisions associated with deleted workspaces.

Overrides WorkspaceManagerInterface::purgeDeletedWorkspacesBatch

File

core/modules/workspaces/src/WorkspaceManager.php, line 322

Class

WorkspaceManager
Provides the workspace manager.

Namespace

Drupal\workspaces

Code

public function purgeDeletedWorkspacesBatch() {
  $deleted_workspace_ids = $this->state
    ->get('workspace.deleted', []);
  // Bail out early if there are no workspaces to purge.
  if (empty($deleted_workspace_ids)) {
    return;
  }
  $batch_size = Settings::get('entity_update_batch_size', 50);
  // Get the first deleted workspace from the list and delete the revisions
  // associated with it, along with the workspace association records.
  $workspace_id = reset($deleted_workspace_ids);
  $all_associated_revisions = [];
  foreach (array_keys($this->workspaceInfo
    ->getSupportedEntityTypes()) as $entity_type_id) {
    $all_associated_revisions[$entity_type_id] = $this->workspaceAssociation
      ->getAssociatedRevisions($workspace_id, $entity_type_id);
  }
  $all_associated_revisions = array_filter($all_associated_revisions);
  $count = 1;
  foreach ($all_associated_revisions as $entity_type_id => $associated_revisions) {
    /** @var \Drupal\Core\Entity\RevisionableStorageInterface $associated_entity_storage */
    $associated_entity_storage = $this->entityTypeManager
      ->getStorage($entity_type_id);
    // Sort the associated revisions in reverse ID order, so we can delete the
    // most recent revisions first.
    krsort($associated_revisions);
    // Get a list of default revisions tracked by the given workspace, because
    // they need to be handled differently than pending revisions.
    $initial_revision_ids = $this->workspaceAssociation
      ->getAssociatedInitialRevisions($workspace_id, $entity_type_id);
    foreach (array_keys($associated_revisions) as $revision_id) {
      if ($count > $batch_size) {
        continue 2;
      }
      // If the workspace is tracking the entity's default revision (i.e. the
      // entity was created inside that workspace), we need to delete the
      // whole entity after all of its pending revisions are gone.
      if (isset($initial_revision_ids[$revision_id])) {
        $associated_entity_storage->delete([
          $associated_entity_storage->load($initial_revision_ids[$revision_id]),
        ]);
      }
      else {
        // Delete the associated entity revision.
        $associated_entity_storage->deleteRevision($revision_id);
      }
      $count++;
    }
  }
  // The purging operation above might have taken a long time, so we need to
  // request a fresh list of tracked entities. If it is empty, we can go ahead
  // and remove the deleted workspace ID entry from state.
  $has_associated_revisions = FALSE;
  foreach (array_keys($this->workspaceInfo
    ->getSupportedEntityTypes()) as $entity_type_id) {
    if (!empty($this->workspaceAssociation
      ->getAssociatedRevisions($workspace_id, $entity_type_id))) {
      $has_associated_revisions = TRUE;
      break;

    }
  }
  if (!$has_associated_revisions) {
    unset($deleted_workspace_ids[$workspace_id]);
    $this->state
      ->set('workspace.deleted', $deleted_workspace_ids);
    // Delete any possible leftover association entries.
    $this->workspaceAssociation
      ->deleteAssociations($workspace_id);
  }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.