123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- declare(strict_types=1);
- namespace Magento\Framework\GraphQlSchemaStitching\GraphQlReader\MetaReader;
- use Magento\Framework\GraphQlSchemaStitching\GraphQlReader\MetaReader\TypeMetaWrapperReader;
- /**
- * Reads fields and possible arguments from a meta field
- */
- class FieldMetaReader
- {
- /**
- * @var TypeMetaWrapperReader
- */
- private $typeMetaReader;
- /**
- * @var DocReader
- */
- private $docReader;
- /**
- * @param TypeMetaWrapperReader $typeMetaReader
- * @param DocReader $docReader
- */
- public function __construct(TypeMetaWrapperReader $typeMetaReader, DocReader $docReader)
- {
- $this->typeMetaReader = $typeMetaReader;
- $this->docReader = $docReader;
- }
- /**
- * Read field and possible arguments from a field meta
- *
- * @param \GraphQL\Type\Definition\FieldDefinition $fieldMeta
- * @return array
- */
- public function read(\GraphQL\Type\Definition\FieldDefinition $fieldMeta) : array
- {
- $fieldName = $fieldMeta->name;
- $fieldTypeMeta = $fieldMeta->getType();
- $result = [
- 'name' => $fieldName,
- 'arguments' => []
- ];
- $fieldResolver = $this->getFieldResolver($fieldMeta);
- if (!empty($fieldResolver)) {
- $result['resolver'] = $fieldResolver;
- }
- $result = array_merge(
- $result,
- $this->typeMetaReader->read($fieldTypeMeta, TypeMetaWrapperReader::OUTPUT_FIELD_PARAMETER)
- );
- if ($this->docReader->read($fieldMeta->astNode->directives)) {
- $result['description'] = $this->docReader->read($fieldMeta->astNode->directives);
- }
- $arguments = $fieldMeta->args;
- foreach ($arguments as $argumentMeta) {
- $argumentName = $argumentMeta->name;
- $result['arguments'][$argumentName] = [
- 'name' => $argumentName,
- ];
- if ($argumentMeta->defaultValue !== null) {
- $result['arguments'][$argumentName]['defaultValue'] = $argumentMeta->defaultValue;
- }
- $typeMeta = $argumentMeta->getType();
- $result['arguments'][$argumentName] = array_merge(
- $result['arguments'][$argumentName],
- $this->typeMetaReader->read($typeMeta, TypeMetaWrapperReader::ARGUMENT_PARAMETER)
- );
- if ($this->docReader->read($argumentMeta->astNode->directives)) {
- $result['arguments'][$argumentName]['description'] =
- $this->docReader->read($argumentMeta->astNode->directives);
- }
- }
- return $result;
- }
- /**
- * Read resolver if an annotation with the class of the resolver is defined in the meta
- *
- * @param \GraphQL\Type\Definition\FieldDefinition $fieldMeta
- * @return string
- */
- private function getFieldResolver(\GraphQL\Type\Definition\FieldDefinition $fieldMeta) : string
- {
- /** @var \GraphQL\Language\AST\NodeList $directives */
- $directives = $fieldMeta->astNode->directives;
- foreach ($directives as $directive) {
- if ($directive->name->value == 'resolver') {
- foreach ($directive->arguments as $directiveArgument) {
- if ($directiveArgument->name->value == 'class') {
- return $directiveArgument->value->value;
- }
- }
- }
- }
- return '';
- }
- }
|