graphql_core_schema-1.0.x-dev/src/Wrappers/QueryConnection.php

src/Wrappers/QueryConnection.php
<?php

namespace Drupal\graphql_core_schema\Wrappers;

use Drupal\Core\Entity\Query\QueryInterface;
use Drupal\Core\Entity\TranslatableInterface;
use Drupal\graphql\GraphQL\Execution\ResolveContext;
use GraphQL\Deferred;

/**
 * Helper class that wraps entity queries.
 */
class QueryConnection {

  public function __construct(
    protected QueryInterface $query,
    protected string $langcode,
  ) {
  }

  /**
   * Get the total results.
   *
   * @return int
   *   The number of results.
   */
  public function total() {
    $query = clone $this->query;
    $query->range(NULL, NULL)->count();
    /** @var int */
    return $query->execute();
  }

  /**
   * Get the items.
   *
   * @param Drupal\graphql\GraphQL\Execution\ResolveContext $context
   *   The resolve context.
   *
   * @return array|\GraphQL\Deferred
   *   The result.
   */
  public function items(ResolveContext $context) {
    $result = $this->query->execute();

    if (empty($result)) {
      return [];
    }

    $callback = $this->getResolveCallback($result);

    return new Deferred(function () use ($callback, $context) {
      $entities = $callback();
      $items = [];

      /** @var \Drupal\Core\Entity\EntityInterface $entity */
      foreach (array_values($entities) as $entity) {
        if (
          $this->langcode &&
          $entity instanceof TranslatableInterface &&
          $entity->hasTranslation($this->langcode)
        ) {
          $entity = $entity->getTranslation($this->langcode);
        }
        $entity->addCacheContexts(["static:language:{$this->langcode}"]);
        $access = $entity->access('view', NULL, TRUE);
        $context->addCacheableDependency($access);

        if ($access->isAllowed()) {
          $items[] = $entity;
        }
        else {
          $items[] = NULL;
        }
      }

      return $items;
    });
  }

  /**
   * Return the correct buffer callback for loading the entities.
   *
   * @param array $result
   *   The query result.
   *
   * @return mixed
   *   The callback
   */
  private function getResolveCallback(array $result) {
    // Check if the entity type is revisionable.
    $entityType = \Drupal::entityTypeManager()->getDefinition($this->query->getEntityTypeId());
    if ($entityType->isRevisionable()) {
      $buffer = \Drupal::service('graphql.buffer.entity_revision');
      return $buffer->add($this->query->getEntityTypeId(), array_keys($result));
    }

    /** @var \Drupal\graphql\GraphQL\Buffers\EntityBuffer $buffer */
    $buffer = \Drupal::service('graphql.buffer.entity');
    return $buffer->add($this->query->getEntityTypeId(), array_values($result));
  }

}

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

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