graphql_compose-1.0.0-beta20/modules/graphql_compose_edges/src/Plugin/GraphQL/SchemaExtension/EdgesSchemaExtension.php

modules/graphql_compose_edges/src/Plugin/GraphQL/SchemaExtension/EdgesSchemaExtension.php
<?php

declare(strict_types=1);

namespace Drupal\graphql_compose_edges\Plugin\GraphQL\SchemaExtension;

use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\graphql\Attribute\SchemaExtension;
use Drupal\graphql\GraphQL\ResolverBuilder;
use Drupal\graphql\GraphQL\ResolverRegistryInterface;
use Drupal\graphql_compose\Plugin\GraphQL\SchemaExtension\ResolverOnlySchemaExtensionPluginBase;
use Drupal\graphql_compose_edges\EnabledBundlesTrait;

/**
 * Add edge resolution.
 */
#[SchemaExtension(
  id: "graphql_compose_edges",
  name: new TranslatableMarkup("GraphQL Compose Edges"),
  description: new TranslatableMarkup("Multiple query loading edge connections per entity type."),
  schema: "graphql_compose",
  priority: 0,
)]
class EdgesSchemaExtension extends ResolverOnlySchemaExtensionPluginBase {

  use EnabledBundlesTrait;

  /**
   * {@inheritdoc}
   *
   * @throws \InvalidArgumentException
   */
  public function registerResolvers(ResolverRegistryInterface $registry): void {
    $builder = new ResolverBuilder();

    // Connection fields.
    $registry->addFieldResolver('Connection', 'edges',
      $builder->produce('connection_edges')
        ->map('connection', $builder->fromParent())
    );

    $registry->addFieldResolver('Connection', 'nodes',
      $builder->produce('connection_nodes')
        ->map('connection', $builder->fromParent())
    );

    $registry->addFieldResolver('Connection', 'pageInfo',
      $builder->produce('connection_page_info')
        ->map('connection', $builder->fromParent())
    );

    // Edge fields.
    $registry->addFieldResolver('Edge', 'cursor',
      $builder->produce('edge_cursor')
        ->map('edge', $builder->fromParent())
    );

    $registry->addFieldResolver('Edge', 'node',
      $builder->produce('edge_node')
        ->map('edge', $builder->fromParent())
    );

    // Bundle edges.
    foreach ($this->getEnabledBundlePlugins() as $bundle) {

      // Construct a deriver producer id.
      $default_producer = [
        'graphql_compose_edges_entity_type',
        $bundle->getEntityTypePlugin()->getEntityTypeId(),
        $bundle->getEntity()->id(),
      ];

      // graphql_compose_edges_entity_type:node:page.
      $default_producer = implode(':', $default_producer);

      $definition = $bundle->getEntityTypePlugin()->getPluginDefinition();

      // Some extensions may opt to put the connection elsewhere.
      // How they do that is up to that extension.
      $query_enabled = $definition['third_party_settings']['edges_query'] ?? TRUE;
      if (!$query_enabled) {
        continue;
      }

      $registry->addFieldResolver(
        'Query',
        $bundle->getNamePluralSdl(),

        $builder->compose(
          $builder->produce('language_context')
            ->map('language', $builder->fromArgument('langcode')),

          $builder->produce($definition['third_party_settings']['edges_producer'] ?? $default_producer)
            ->map('after', $builder->fromArgument('after'))
            ->map('before', $builder->fromArgument('before'))
            ->map('first', $builder->fromArgument('first'))
            ->map('last', $builder->fromArgument('last'))
            ->map('reverse', $builder->fromArgument('reverse'))
            ->map('sortKey', $builder->fromArgument('sortKey'))
            ->map('langcode', $builder->fromArgument('langcode'))
        )
      );

    }
  }

}

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

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