content_workflow_bynder-1.0.0/src/DrupalContentWorkflowBynderClient.php

src/DrupalContentWorkflowBynderClient.php
<?php

namespace Drupal\content_workflow_bynder;

use GatherContent\GatherContentClient;
use GuzzleHttp\ClientInterface;
use GuzzleHttp\Pool;

/**
 * Extends the GatherContentClient class with Drupal specific functionality.
 */
class DrupalContentWorkflowBynderClient extends GatherContentClient {

  /**
   * Module extension list.
   *
   * @var \Drupal\Core\Extension\ModuleExtensionList;
   */
  protected $extensionList;

  /**
   * {@inheritdoc}
   */
  public function __construct(ClientInterface $client) {
    parent::__construct($client);
    $this->setCredentials();
    $this->extensionList = \Drupal::service('extension.list.module');
  }

  /**
   * {@inheritdoc}
   */
  public function getVersionString() {
    $frameworkName = 'Drupal';
    $frameworkVersion = \Drupal::VERSION;
    $info = $this->extensionList->getExtensionInfo('content_workflow_bynder');
    $integrationVersion = $info['version'] ?? 'dev';

    return sprintf('Integration-%s-%s/%s', $frameworkName, $frameworkVersion, $integrationVersion);
  }

  /**
   * Put the authentication config into client.
   */
  public function setCredentials() {
    $config = \Drupal::config('content_workflow_bynder.settings');
    $this->setEmail($config->get('username') ?: '');
    $this->setApiKey($config->get('api_key') ?: '');
  }

  /**
   * Retrieve the account id of the given account.
   *
   * If none given, retrieve the first account by default.
   */
  public static function getAccountId($accountName = NULL) {
    $account = \Drupal::config('content_workflow_bynder.settings')
      ->get('account');
    $account = unserialize($account);
    if (!is_array($account)) {
      return NULL;
    }

    if (!$accountName) {
      if (reset($account)) {
        return key($account);
      }
    }

    foreach ($account as $id => $name) {
      if ($name === $accountName) {
        return $id;
      }
    }

    return NULL;
  }

  /**
   * Retrieve all the active projects.
   */
  public function getActiveProjects($accountId) {
    $projects = $this->projectsGet($accountId);

    foreach ($projects['data'] as $id => $project) {
      if (!$project->active) {
        unset($projects['data'][$id]);
      }
    }

    $projects['data'] = $this->reKeyArray($projects['data'], 'id');

    return $projects;
  }

  /**
   * Returns a formatted array with the template ID's as a key.
   *
   * @param int $projectId
   *   Project ID.
   *
   * @return array
   *   Return array.
   */
  public function getTemplatesOptionArray($projectId) {
    $formatted = [];
    $templates = $this->templatesGet($projectId);

    foreach ($templates['data'] as $template) {
      $formatted[$template->id] = $template->name;
    }

    return $formatted;
  }

  /**
   * Returns the response body.
   *
   * @param bool $jsonDecoded
   *   If TRUE the method will return the body json_decoded.
   *
   * @return \Psr\Http\Message\StreamInterface
   *   Response body.
   */
  public function getBody($jsonDecoded = FALSE) {
    $body = $this->getResponse()->getBody();

    if ($jsonDecoded) {
      return json_decode($body);
    }

    return $body;
  }

  /**
   * Downloads all files asynchronously.
   *
   * @param array $files
   *   Files object array.
   * @param string $directory
   *   Destination directory.
   * @param string $language
   *   Language string.
   *
   * @return array
   *   Imported files array.
   */
  public function downloadFiles(array $files, $directory, $language) {
    $entityTypeManager = \Drupal::service('entity_type.manager');
    /** @var \GuzzleHttp\Client $httpClient */
    $httpClient = $this->client;
    $options = [
      'auth' => $this->getRequestAuth(),
      'headers' => [],
    ];

    $options['headers'] += $this->getRequestHeaders();

    // Remove unnecessary associative array keys.
    $files = array_values($files);
    $importedFiles = [];

    $requests = function () use ($httpClient, $files, $options) {
      foreach ($files as $file) {
        if (!$file) {
          continue;
        }

        yield function () use ($httpClient, $file, $options) {
          return $httpClient->getAsync($file->url, $options);
        };
      }
    };

    $pool = new Pool(
      $httpClient,
      $requests(),
      [
        'fulfilled' => function ($response, $index) use ($files, $directory, $language, &$importedFiles, $entityTypeManager) {
          if ($response->getStatusCode() === 200) {
            $file = $entityTypeManager
              ->getStorage('file')
              ->loadByProperties(['cwb_file_id' => $files[$index]->fileId]);

            if ($file) {
              $file = reset($file);
              $importedFiles[$index] = $file->id();
              return;
            }

            $path = $directory . '/' . $files[$index]->filename;

            $importedFile = \Drupal::service('file.repository')->writeData($response->getBody(), $path);

            if ($importedFile) {
              $importedFile
                ->set('cwb_file_id', $files[$index]->fileId)
                ->set('langcode', $language)
                ->set('filesize', $files[$index]->size)
                ->save();

              $importedFiles[$index] = $importedFile->id();
            }
          }
        },
      ]
    );

    $promise = $pool->promise();
    $promise->wait();

    ksort($importedFiles);
    return $importedFiles;
  }

  /**
   * {@inheritdoc}
   */
  public function templateGet($templateId) {
    $template = parent::templateGet($templateId);

    if (empty($template['related'])) {
      return $template;
    }

    // Add the ID as the array key.
    $groups = $template['related']->structure->groups;

    foreach ($groups as $group) {
      $group->fields = $this->reKeyArray($group->fields, 'id');
    }

    $template['related']->structure->groups = $this->reKeyArray($groups, 'id');

    return $template;
  }

  /**
   * {@inheritdoc}
   */
  public function projectStatusesGet($projectId) {
    $statuses = parent::projectStatusesGet($projectId);

    if (empty($statuses['data'])) {
      return $statuses;
    }

    // Add the ID as the array key.
    $statuses['data'] = $this->reKeyArray($statuses['data'], 'id');

    return $statuses;
  }

  /**
   * Create new assoc array with the key parameter as array key.
   *
   * @param array $array
   *   Array to re-key.
   * @param string $key
   *   The key to re-key by.
   *
   * @return array
   *   Returns the re-keyed array.
   */
  protected function reKeyArray(array $array, $key) {
    $items = [];
    foreach ($array as $item) {
      $items[$item->{$key}] = $item;
    }

    return $items;
  }

}

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

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