You are here

public function EntityShareClientCliService::pullUpdates in Entity Share 8.2

Pull changed content.

Parameters

\Drupal\entity_share_client\Entity\RemoteInterface $remote: The remote website entity to import from.

string $channel_url: The remote channel URL to import.

string $channel_url_uuid: The remote channel URL to import keyed by 'url_uuid' in the channel infos.

string $entity_type_id: The entity type ID to import.

Return value

int The number of updated content.

1 call to EntityShareClientCliService::pullUpdates()
EntityShareClientCliService::ioPullUpdates in modules/entity_share_client/src/Service/EntityShareClientCliService.php
Handle the pull updates interaction.

File

modules/entity_share_client/src/Service/EntityShareClientCliService.php, line 211

Class

EntityShareClientCliService
Class EntityShareClientCliService.

Namespace

Drupal\entity_share_client\Service

Code

public function pullUpdates(RemoteInterface $remote, $channel_url, $channel_url_uuid, $entity_type_id) {

  // Import channel content and loop on pagination.
  $this->jsonapiHelper
    ->setRemote($remote);
  $http_client = $this->remoteManager
    ->prepareJsonApiClient($remote);
  $original_channel_url = $channel_url;
  $storage = $this->entityTypeManager
    ->getStorage($entity_type_id);
  $offset = 0;
  $update_count = 0;
  while ($channel_url) {

    // Offset pagination.
    $parsed_url = UrlHelper::parse($channel_url_uuid);
    $parsed_url['query']['page']['offset'] = $offset;
    $query = UrlHelper::buildQuery($parsed_url['query']);
    $revisions_url = $parsed_url['path'] . '?' . $query;

    // Get UUIDs and update timestamps from next page in a row.
    $response = $this->requestService
      ->request($http_client, 'GET', $revisions_url);
    $revisions_json = Json::decode((string) $response
      ->getBody());
    $uuids = [];
    foreach ($revisions_json['data'] as $row) {

      // Look for query with the same UUID and changed timestamp,
      // if that entity doesn't exist it means we need to pull it from remote
      // channel.
      $changed_datetime_timestamp = 0;

      // If the website is using backward compatible timestamps output.
      // @see https://www.drupal.org/node/2859657.
      if (is_numeric($row['attributes']['changed'])) {

        // The value is casted in integer for
        // https://www.drupal.org/node/2837696.
        $changed_datetime_timestamp = (int) $row['attributes']['changed'];
      }
      elseif ($changed_datetime = \DateTime::createFromFormat(\DateTime::RFC3339, $row['attributes']['changed'])) {
        $changed_datetime_timestamp = $changed_datetime
          ->getTimestamp();
      }
      $entity_changed = $storage
        ->getQuery()
        ->condition('uuid', $row['id'])
        ->condition('changed', $changed_datetime_timestamp)
        ->count()
        ->execute();
      if ($entity_changed == 0) {
        $uuids[] = $row['id'];
      }
    }
    if (!empty($uuids)) {

      // Prepare JSON filter query string.
      $filter = [
        'filter' => [
          'uuid-filter' => [
            'condition' => [
              'path' => 'id',
              'operator' => 'IN',
              'value' => $uuids,
            ],
          ],
        ],
      ];

      // Call remote channel and fetch content of entities which should be
      // updated.
      $parsed_original_channel_url = UrlHelper::parse($original_channel_url);
      $filter_query = $parsed_original_channel_url['query'];
      $filter_query = array_merge_recursive($filter_query, $filter);
      $filter_query = UrlHelper::buildQuery($filter_query);
      $filtered_url = $parsed_original_channel_url['path'] . '?' . $filter_query;
      $response = $this->requestService
        ->request($http_client, 'GET', $filtered_url);
      $json = Json::decode((string) $response
        ->getBody());
      $imported_entities = $this->jsonapiHelper
        ->importEntityListData(EntityShareUtility::prepareData($json['data']));
      $update_count += count($imported_entities);
    }
    if (isset($revisions_json['links']['next']['href'])) {
      $channel_url = $revisions_json['links']['next']['href'];
    }
    else {
      $channel_url = FALSE;
    }

    // Update page number and offset for next API call.
    $offset += 50;
  }
  return $update_count;
}