bridtv-8.x-1.x-dev/src/BridSyncBase.php

src/BridSyncBase.php
<?php

namespace Drupal\bridtv;

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\KeyValueStore\KeyValueFactoryInterface;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Queue\RequeueException;
use Drupal\Core\Queue\SuspendQueueException;
use Drupal\Core\StringTranslation\StringTranslationTrait;

/**
 * Abstract base  class for handling synchronization of video data.
 */
abstract class BridSyncBase {

  use StringTranslationTrait;

  /**
   * Lease time of claimed queue items.
   */
  const LEASE_TIME = 60;

  /**
   * The default number of video items to process per queue item.
   */
  const ITEMS_PER_QUEUE_ITEM = 5;

  /**
   * The queue holding sync items.
   *
   * @var \Drupal\Core\Queue\QueueInterface
   */
  protected $queue;

  /**
   * The corresponding queue worker.
   *
   * @var \Drupal\Core\Queue\QueueWorkerInterface
   */
  protected $worker;

  /**
   * The settings.
   *
   * @var \Drupal\Core\Config\ImmutableConfig
   */
  protected $settings;

  /**
   * The consumer.
   *
   * @var \Drupal\bridtv\BridApiConsumer
   */
  protected $consumer;

  /**
   * The key value storage.
   *
   * @var \Drupal\Core\KeyValueStore\KeyValueStoreInterface
   */
  protected $keyValue;

  /**
   * The Brid Entity Resolver Interface.
   *
   * @var \Drupal\bridtv\BridEntityResolverInterface
   */
  protected $entityResolver;

  /**
   * Sets the Auto create Enabled.
   *
   * @var bool
   */
  protected $autocreateEnabled;

  /**
   * Sets the Auto delete Enabled.
   *
   * @var bool
   */
  protected $autodeleteEnabled;

  /**
   * The messenger.
   *
   * @var \Drupal\Core\Messenger\MessengerInterface
   */
  protected $messenger;

  /**
   * The logger instance.
   *
   * @var \Psr\Log\LoggerInterface
   */
  protected $logger;

  /**
   * BridSyncBase constructor.
   *
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The config factory interface.
   * @param \Drupal\Core\Logger\LoggerChannelFactoryInterface $logger_factory
   *   The logger channel factory interface.
   * @param \Drupal\bridtv\BridApiConsumer $consumer
   *   The brid api consumer.
   * @param \Drupal\bridtv\BridEntityResolverInterface $entity_resolver
   *   The brid entity resolver interface.
   * @param \Drupal\Core\KeyValueStore\KeyValueFactoryInterface $kv_factory
   *   The key value factory interface.
   * @param \Drupal\Core\Messenger\MessengerInterface $messenger
   *   The messenger interface.
   */
  public function __construct(ConfigFactoryInterface $config_factory, LoggerChannelFactoryInterface $logger_factory, BridApiConsumer $consumer, BridEntityResolverInterface $entity_resolver, KeyValueFactoryInterface $kv_factory, MessengerInterface $messenger) {
    $this->settings = $config_factory->get('bridtv.settings');
    $this->logger = $logger_factory->get('bridtv');
    $this->messenger = $messenger;
    $this->consumer = $consumer;
    $this->entityResolver = $entity_resolver;
    $this->keyValue = $kv_factory->get('bridtv');
    $this->autocreateEnabled(!empty($this->settings->get('sync_autocreate')));
    $this->autodeleteEnabled(!empty($this->settings->get('sync_autodelete')));
  }

  /**
   * Sync players info.
   */
  public function syncPlayersInfo() {
    // Delete all player data.
    $this->keyValue->deleteAll();

    // Sync Player list.
    $consumer = $this->consumer;
    $player_list = [];
    if ($consumer->isReady() && $decoded = $consumer->getDecodedPlayersList()) {
      if (isset($decoded['data'])) {
        $player_list = $decoded['data'];
        $this->keyValue->set('players_list', BridSerialization::encode($player_list));
      }
    }

    // Sync Player data for each player in list.
    // TODO: If there are too many players defined, this may timeout therefore
    // it may need to be implemented as batch operation.
    foreach ($player_list as $id => $player) {
      $key = 'player_data.' . $id;
      if ($consumer->isReady() && ($player = $consumer->fetchPlayerData($id))) {
        $this->keyValue->set($key, $player);
      }
    }
  }

  /**
   * Run.
   */
  public function run($limit = -1) {
    $limit = (int) $limit;
    $this->prepareFullSync();
    for ($i = 0; $i !== $limit; $i++) {
      if (!$this->processNextItem()) {
        break;
      };
    }
  }

  /**
   * Process next item.
   */
  public function processNextItem() {
    $queue = $this->queue;
    $worker = $this->worker;

    if (!($item = $queue->claimItem(static::LEASE_TIME))) {
      $this->logger->info($this->t('No more items in the queue for processing synchronization.'));
      return FALSE;
    }

    try {
      $worker->processItem($item->data);
      $queue->deleteItem($item);
      return TRUE;
    }
    catch (RequeueException $e) {
      // The worker requested the task to be immediately requeued.
      $queue->releaseItem($item);
      return TRUE;
    }
    catch (SuspendQueueException $e) {
      $queue->releaseItem($item);
      $queue->deleteQueue();
      watchdog_exception('bridtv', $e);
    }
    catch (\Exception $e) {
      // In case of any other kind of exception, log it and leave the item
      // in the queue to be processed again later.
      watchdog_exception('bridtv', $e);
    }
    $this->logger->error('The Brid.TV queue for video/playlist data synchronization has stopped working properly. See the Watchdog log messages for further messages.');
    return FALSE;
  }

  /**
   * Queue remote list item.
   */
  public function queueRemoteListItem($page, $queue_next) {
    $this->queue->createItem(['page' => $page, 'q_next' => $queue_next]);
  }

  /**
   * Queue entity item.
   */
  public function queueEntityItem($entity_id, $queue_next) {
    $this->queue->createItem([
      'entity_id' => $entity_id,
      'q_next' => $queue_next,
    ]);
  }

  /**
   * Queue multiple entities item.
   */
  public function queueMultipleEntitiesItem(array $entity_ids, $queue_next) {
    $this->queue->createItem([
      'entity_ids' => $entity_ids,
      'q_next' => $queue_next,
    ]);
  }

  /**
   * Get consumer.
   *
   * @return \Drupal\bridtv\BridApiConsumer
   *   Returns the BridApiConsumer.
   */
  public function getConsumer() {
    return $this->consumer;
  }

  /**
   * Returns the entity resolver.
   *
   * @return \Drupal\bridtv\BridEntityResolver
   *   Returns the BridEntityResolver.
   */
  public function getEntityResolver() {
    return $this->entityResolver;
  }

  /**
   * Checks if autocreate is enabled or not.
   *
   * @return bool
   *   Autocreate or not.
   */
  public function autocreateEnabled($autocreate = NULL) {
    if (isset($autocreate)) {
      $this->autocreateEnabled = !empty($autocreate);
    }
    return $this->autocreateEnabled;
  }

  /**
   * Checks if autocdelete is enabled or not.
   *
   * @return bool
   *   Autodelete or not.
   */
  public function autodeleteEnabled($autodelete = NULL) {
    if (isset($autodelete)) {
      $this->autodeleteEnabled = !empty($autodelete);
    }
    return $this->autodeleteEnabled;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc