You are here

acquia_contenthub_subscriber.migrate.inc in Acquia Content Hub 8.2

Post-update functions for Content Hub Subscriber.

File

modules/acquia_contenthub_subscriber/acquia_contenthub_subscriber.migrate.inc
View source
<?php

/**
 * @file
 * Post-update functions for Content Hub Subscriber.
 */
use Drupal\Core\Entity\RevisionableInterface;

/**
 * @addtogroup updates-8.6.x-contenthub-subscriher-track-imported-entities
 * @{
 */

/**
 * Sends imported entities from legacy tracking table to interest list.
 *
 * @param mixed $context
 *   The context array.
 */
function acquia_contenthub_subscriber_track_imported_linked_entities(&$context) {
  $database = \Drupal::database();
  if (!$database
    ->schema()
    ->tableExists('acquia_contenthub_entities_tracking')) {
    return;
  }
  $import_status_auto_update = [
    'AUTO_UPDATE_ENABLED',
    'PENDING_SYNC',
    'QUEUED',
  ];
  $query = $database
    ->select('acquia_contenthub_entities_tracking', 't')
    ->fields('t', [
    'entity_id',
    'entity_uuid',
    'entity_type',
  ]);
  $query
    ->condition('status_import', $import_status_auto_update, 'IN');
  if (!isset($context['sandbox']['progress'])) {
    $max = $query
      ->countQuery()
      ->execute()
      ->fetchField();
    $context['sandbox']['progress'] = 0;
    $context['finished'] = 0;
    $context['sandbox']['max'] = $max;
  }
  $limit = 50;

  // Obtain the list of entities to enqueue.
  $results = $query
    ->range($context['sandbox']['progress'], $limit)
    ->execute();
  $uuids = [];
  $subscriber_tracker = \Drupal::service('acquia_contenthub_subscriber.tracker');
  $entity_repository = \Drupal::service('entity.repository');
  foreach ($results as $result) {
    $entity = $entity_repository
      ->loadEntityByUuid($result->entity_type, $result->entity_uuid);
    $subscriber_tracker
      ->track($entity, '');
    $uuids[] = $result->entity_uuid;

    // Updating progress.
    $context['sandbox']['progress']++;
  }

  /** @var \Drupal\acquia_contenthub\Client\ClientFactory $client_factory */
  $client_factory = \Drupal::service('acquia_contenthub.client.factory');
  $config = \Drupal::configFactory()
    ->get('acquia_contenthub.admin_settings');
  $webhook = $config
    ->get('webhook');
  $webhook_uuid = $webhook['uuid'] ?? NULL;
  if ($webhook_uuid && $uuids && ($config
    ->get('send_contenthub_updates') ?? TRUE)) {

    // Adding imported entities to interest list.
    $settings = $client_factory
      ->getSettings();
    $client_factory
      ->getClient($settings)
      ->addEntitiesToInterestList($webhook_uuid, $uuids);
    $logger = \Drupal::logger('acquia_contenthub_subscriber');
    $logger
      ->debug(dt('Added %count out of %total entities to the interest list.', [
      '%count' => $context['sandbox']['progress'],
      '%total' => $context['sandbox']['max'],
    ]));
  }

  // Did we finish yet?
  if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
    $context['finished'] = $context['sandbox']['progress'] / $context['sandbox']['max'];
  }
  else {
    $context['finished'] = 1;

    // Delete all dependent entities. They will be imported as dependencies.
    $database
      ->delete('acquia_contenthub_entities_tracking')
      ->condition('status_import', 'IS_DEPENDENT', '=')
      ->execute();
    $database
      ->delete('acquia_contenthub_entities_tracking')
      ->condition('status_import', $import_status_auto_update, 'IN')
      ->execute();
  }
}

/**
 * Stores imported entities with local changes to a state variable.
 *
 * @param mixed $context
 *   The context array.
 */
function acquia_contenthub_subscriber_track_imported_unlinked_entities(&$context) {
  $database = \Drupal::database();
  if (!$database
    ->schema()
    ->tableExists('acquia_contenthub_entities_tracking')) {
    return;
  }
  $logger = \Drupal::logger('acquia_contenthub_subscriber');
  $entity_type_manager = \Drupal::entityTypeManager();
  $import_status_no_auto_update = [
    'AUTO_UPDATE_DISABLED',
    'HAS_LOCAL_CHANGE',
  ];
  $query = $database
    ->select('acquia_contenthub_entities_tracking', 't')
    ->fields('t', [
    'entity_id',
    'entity_uuid',
    'entity_type',
  ]);
  $query
    ->condition('status_import', $import_status_no_auto_update, 'IN');
  if (!isset($context['sandbox']['progress'])) {
    $max = $query
      ->countQuery()
      ->execute()
      ->fetchField();
    $context['sandbox']['progress'] = 0;
    $context['finished'] = 0;
    $context['sandbox']['max'] = $max;
  }
  $limit = 50;

  // Obtain the list of entities to enqueue.
  $results = $query
    ->range($context['sandbox']['progress'], $limit)
    ->execute();
  $unlinked = [];
  foreach ($results as $result) {
    $uuid = $result->entity_uuid;
    if ($entity = $entity_type_manager
      ->getStorage($result->entity_type)
      ->load($result->entity_id)) {
      $revision_id = NULL;
      if ($entity instanceof RevisionableInterface) {
        $revision_id = $entity
          ->getRevisionId() ?: NULL;
      }

      // Collect entity id, type and revision_id from all imported entities
      // with local changes or disconnected from Content Hub.
      $unlinked[$uuid] = [
        'id' => $result->entity_id,
        'uuid' => $result->entity_uuid,
        'type' => $result->entity_type,
        'revision_id' => $revision_id,
      ];
      $logger
        ->debug(sprintf('Entity disconnected from Content Hub: (id = %s, UUID = %s, type = %s, revision_id = %s)', $result->entity_id, $result->entity_uuid, $result->entity_type, $revision_id));
    }

    // Updating progress.
    $context['sandbox']['progress']++;
  }
  if (!empty($unlinked)) {
    $state = \Drupal::state();
    $disconnected_entities = $state
      ->get('acquia_contenthub_update_82001_disconnected_entities', []);
    $disconnected_entities = array_merge($disconnected_entities, $unlinked);
    $state
      ->set('acquia_contenthub_update_82001_disconnected_entities', $disconnected_entities);
  }

  // Did we finish yet?
  if ($context['sandbox']['progress'] != $context['sandbox']['max']) {
    $context['finished'] = $context['sandbox']['max'] > 0 ? $context['sandbox']['progress'] / $context['sandbox']['max'] : 1;
  }
  else {
    $context['finished'] = 1;

    // Delete the unlinked entities from the tracking table.
    $database
      ->delete('acquia_contenthub_entities_tracking')
      ->condition('status_import', $import_status_no_auto_update, 'IN')
      ->execute();

    // Delete legacy tracking table if empty.
    $query = $database
      ->select('acquia_contenthub_entities_tracking', 't')
      ->fields('t', [
      'entity_id',
      'entity_uuid',
      'entity_type',
    ]);
    $count = $query
      ->countQuery()
      ->execute()
      ->fetchField();
    if ($count == 0) {

      // If table is empty, drop it.
      $database
        ->schema()
        ->dropTable('acquia_contenthub_entities_tracking');
    }
  }
}

/**
 * @} End of "addtogroup updates-8.6.x-contenthub-subscriher-track-imported-entities.
 */

Functions

Namesort descending Description
acquia_contenthub_subscriber_track_imported_linked_entities Sends imported entities from legacy tracking table to interest list.
acquia_contenthub_subscriber_track_imported_unlinked_entities Stores imported entities with local changes to a state variable.