eventbrite_one_way_sync-1.0.0/src/Session/SessionBase.php

src/Session/SessionBase.php
<?php

namespace Drupal\eventbrite_one_way_sync\Session;

use Drupal\Component\Serialization\Json;
use Drupal\eventbrite_one_way_sync\Utilities\CommonUtilities;
use Drupal\eventbrite_one_way_sync\Utilities\DependencyInjection;
use GuzzleHttp\Client;

/**
 * A session is associated with a single key.
 */
abstract class SessionBase implements SessionInterface {

  use CommonUtilities;
  use DependencyInjection;

  /**
   * The Eventbrite account label.
   *
   * @var string
   */
  protected $eventbriteAccountLabel;

  /**
   * Constructor.
   *
   * @param string $eventbrite_account_label
   *   The Eventbrite account label.
   */
  public function __construct(string $eventbrite_account_label) {
    $this->assertNonEmptyString($eventbrite_account_label, 'Eventbrite account label cannot be empty, it should be something like "default".');
    $this->eventbriteAccountLabel = $eventbrite_account_label;
  }

  /**
   * Get the Eventbrite organization ID associated with this session.
   *
   * @return string
   *   An Eventbrite organization ID.
   */
  public function organizationId() : string {
    return $this->getOrganizationId();
  }

  /**
   * Get the organization ID associated with our Eventbrite account.
   *
   * @return string
   *   An organization ID.
   */
  public function getOrganizationId() : string {
    return $this->config()->getOrganizationId($this->eventbriteAccountLabel);
  }

  /**
   * Get the private token associated with our Eventbrite account.
   *
   * @return string
   *   A private token.
   */
  public function getPrivateToken() : string {
    return $this->config()->getPrivateToken($this->eventbriteAccountLabel);
  }

  /**
   * {@inheritdoc}
   */
  public function smokeTest() {
    $result = $this->get('/users/me/');

    foreach (['id', 'name'] as $required_key_in_response) {
      if (!array_key_exists($required_key_in_response, $result)) {
        throw new \Exception('The key ' . $required_key_in_response . ' does not exist in the response of the request, something might be wrong.');
      }
    }

    $result = $this->get('/organizations/' . $this->organizationId() . '/members/');

    if (!array_key_exists('members', $result)) {
      throw new \Exception('The key members does not exist in the response of the request for the organization members, something might be wrong.');
    }
  }

  /**
   * {@inheritdoc}
   */
  public function apiKey() : string {
    $candidate = $this->getPrivateToken();
    $this->assertNonEmptyString($candidate, 'API key cannot be empty.');
    return $candidate;
  }

  /**
   * Get all event occurrences from all pages for this session.
   *
   * This can take an extremely long time so it is best to run this on the
   * command line where the request will not time out.
   *
   * @param callable $log
   *   A log function.
   * @param callable $callback
   *   A callback for each occurrence.
   * @param int $max
   *   A maximum number of occurrences to obtain.
   */
  public function eventOccurrences(callable $log, callable $callback, int $max = PHP_INT_MAX) {
    $this->getAllPages('/organizations/' . $this->organizationId() . '/events/', $log, $callback, 'events', $max);
  }

  /**
   * Get all pages for a request from Eventbrite.
   *
   * This can take an extremely long time so it is best to run this on the
   * command line where the request will not time out.
   *
   * @param string $path
   *   A path such as /organizations/123/events/.
   * @param callable $log
   *   A log function.
   * @param callable $callback
   *   A callback for each occurrence.
   * @param string $eventbrite_account_label
   *   A key we are expecting in the return, such as 'events', or 'series'...
   * @param int $max
   *   A maximum number of occurrences to obtain.
   * @param int $page
   *   The page at which to start.
   */
  public function getAllPages(string $path, callable $log, callable $callback, string $eventbrite_account_label, int $max, int $page = 1) {
    if ($max <= 0) {
      return;
    }

    $log('Calling page ' . $page);

    $result = $this->get($path, [
      'page' => $page,
    ]);

    $more = $result['pagination']['has_more_items'];
    $page_size = $result['pagination']['page_size'];

    $log('Total items: ' . $result['pagination']['object_count']);
    $log('Current page number: ' . $result['pagination']['page_number']);
    $log('Page size is: ' . $page_size);
    $log('Page count is: ' . $result['pagination']['page_count']);
    $log('Has more items: ' . ($more ? 'true' : 'false'));

    foreach ($result[$eventbrite_account_label] as $line) {
      if ($max <= 0) {
        return;
      }
      $callback($line);
      $max--;
    }

    if ($more) {
      $this->getAllPages($path, $log, $callback, $eventbrite_account_label, $max, $page + 1);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function importExistingToQueue(int $max = PHP_INT_MAX) {
    $log = function (string $message) {
      print_r('Log: ' . $message . PHP_EOL);
    };

    $this->eventOccurrences($log, function ($struct) use ($log) {
      $this->processorFactory()->getProcessor($this->eventbriteAccountLabel, $struct, $log)->process();
    }, $max);
  }

  /**
   * {@inheritdoc}
   */
  public function importEventToQueue(string $event_id, callable $log) {
    $this->assertNonEmptyString($event_id, 'Event ID cannot be empty.');

    $this->processorFactory()->getProcessor($this->eventbriteAccountLabel, $this->get('/events/' . $event_id . '/'), $log)->process();
  }

  /**
   * Get the base URL for this request.
   *
   * @return string
   *   Base URL for Eventbrite.
   */
  abstract public function baseUrl() : string;

  /**
   * Get a query result from the Eventbrite API.
   *
   * @param string $path
   *   A path such as /organizations/123/events/.
   * @param array $query_params
   *   Query parameters to send to Eventbrite, other than the API key which
   *   is added automatically.
   */
  public function get(string $path, array $query_params = []) : array {
    $this->assertNonEmptyString($path, 'Path cannot be empty.');
    $full_url = $this->baseUrl() . $path;

    $client = new Client();

    $response = $client->request('GET', $full_url, [
      'query' => $query_params + [
        'token' => $this->apiKey(),
      ],
    ]);

    $candidate = Json::decode($response->getBody());

    if (!is_array($candidate)) {
      throw new \Exception('Eventbrite did not return an array for ' . $path);
    }

    return $candidate;
  }

}

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

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