Skip to content

Commit 851aa37

Browse files
authored
feat(graphql)!: add extra args for custom queries or mutations (#5359)
This commit also removes the generation of the required ID field in case of a custom query or mutation. It is a slight BC break if the user relies on this required ID field. It should be added back with the extra args.
1 parent c353e5a commit 851aa37

File tree

15 files changed

+71
-14
lines changed

15 files changed

+71
-14
lines changed

src/GraphQl/Type/FieldsBuilder.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ public function getItemQueryFields(string $resourceClass, Operation $operation,
8282

8383
if ($fieldConfiguration = $this->getResourceFieldConfiguration(null, $operation->getDescription(), $operation->getDeprecationReason(), new Type(Type::BUILTIN_TYPE_OBJECT, true, $resourceClass), $resourceClass, false, $operation)) {
8484
$args = $this->resolveResourceArgs($configuration['args'] ?? [], $operation);
85-
$configuration['args'] = $args ?: $configuration['args'] ?? ['id' => ['type' => GraphQLType::nonNull(GraphQLType::id())]];
85+
$extraArgs = $this->resolveResourceArgs($operation->getExtraArgs() ?? [], $operation);
86+
$configuration['args'] = $args ?: $configuration['args'] ?? ['id' => ['type' => GraphQLType::nonNull(GraphQLType::id())]] + $extraArgs;
8687

8788
return [$fieldName => array_merge($fieldConfiguration, $configuration)];
8889
}
@@ -103,7 +104,8 @@ public function getCollectionQueryFields(string $resourceClass, Operation $opera
103104

104105
if ($fieldConfiguration = $this->getResourceFieldConfiguration(null, $operation->getDescription(), $operation->getDeprecationReason(), new Type(Type::BUILTIN_TYPE_OBJECT, false, null, true, null, new Type(Type::BUILTIN_TYPE_OBJECT, false, $resourceClass)), $resourceClass, false, $operation)) {
105106
$args = $this->resolveResourceArgs($configuration['args'] ?? [], $operation);
106-
$configuration['args'] = $args ?: $configuration['args'] ?? $fieldConfiguration['args'];
107+
$extraArgs = $this->resolveResourceArgs($operation->getExtraArgs() ?? [], $operation);
108+
$configuration['args'] = $args ?: $configuration['args'] ?? $fieldConfiguration['args'] + $extraArgs;
107109

108110
return [Inflector::pluralize($fieldName) => array_merge($fieldConfiguration, $configuration)];
109111
}
@@ -195,7 +197,7 @@ public function getResourceObjectTypeFields(?string $resourceClass, Operation $o
195197
return $fields;
196198
}
197199

198-
if (!$input || ('create' !== $operation->getName() && !$operation->getInput())) {
200+
if (!$input || (!$operation->getResolver() && 'create' !== $operation->getName())) {
199201
$fields['id'] = $idField;
200202
}
201203
if ($input && $depth >= 1) {

src/GraphQl/Type/TypeBuilder.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,9 @@ public function getResourceObjectType(?string $resourceClass, ResourceMetadataCo
147147
if ($input && $operation instanceof Mutation && null !== $mutationArgs = $operation->getArgs()) {
148148
return $fieldsBuilder->resolveResourceArgs($mutationArgs, $operation) + ['clientMutationId' => $fields['clientMutationId']];
149149
}
150+
if ($input && $operation instanceof Mutation && null !== $extraMutationArgs = $operation->getExtraArgs()) {
151+
return $fields + $fieldsBuilder->resolveResourceArgs($extraMutationArgs, $operation);
152+
}
150153

151154
return $fields;
152155
},

src/Metadata/Extractor/ResourceExtractorTrait.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,20 @@ private function buildArgs(\SimpleXMLElement $resource): ?array
8585
return $data;
8686
}
8787

88+
private function buildExtraArgs(\SimpleXMLElement $resource): ?array
89+
{
90+
if (!isset($resource->extraArgs->arg)) {
91+
return null;
92+
}
93+
94+
$data = [];
95+
foreach ($resource->extraArgs->arg as $arg) {
96+
$data[(string) $arg['id']] = $this->buildValues($arg->values);
97+
}
98+
99+
return $data;
100+
}
101+
88102
private function buildValues(\SimpleXMLElement $resource): array
89103
{
90104
$data = [];

src/Metadata/Extractor/XmlResourceExtractor.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,7 @@ private function buildGraphQlOperations(\SimpleXMLElement $resource, array $root
423423
$data[] = array_merge($datum, [
424424
'resolver' => $this->phpize($operation, 'resolver', 'string'),
425425
'args' => $this->buildArgs($operation),
426+
'extraArgs' => $this->buildExtraArgs($operation),
426427
'class' => (string) $operation['class'],
427428
'read' => $this->phpize($operation, 'read', 'bool'),
428429
'deserialize' => $this->phpize($operation, 'deserialize', 'bool'),

src/Metadata/Extractor/YamlResourceExtractor.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ private function buildGraphQlOperations(array $resource, array $root): ?array
353353
$data[] = array_merge($datum, [
354354
'resolver' => $this->phpize($operation, 'resolver', 'string'),
355355
'args' => $operation['args'] ?? null,
356+
'extraArgs' => $operation['extraArgs'] ?? null,
356357
'class' => (string) $class,
357358
'read' => $this->phpize($operation, 'read', 'bool'),
358359
'deserialize' => $this->phpize($operation, 'deserialize', 'bool'),

src/Metadata/Extractor/schema/resources.xsd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
<xsd:sequence minOccurs="0" maxOccurs="unbounded">
6060
<xsd:group ref="base"/>
6161
<xsd:element name="args" minOccurs="0" type="args"/>
62+
<xsd:element name="extraArgs" minOccurs="0" type="args"/>
6263
</xsd:sequence>
6364
<xsd:attributeGroup ref="base"/>
6465
<xsd:attribute type="xsd:string" name="resolver"/>

src/Metadata/GraphQl/Operation.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class Operation extends AbstractOperation
3737
public function __construct(
3838
protected ?string $resolver = null,
3939
protected ?array $args = null,
40+
protected ?array $extraArgs = null,
4041
protected ?array $links = null,
4142

4243
?string $shortName = null,
@@ -160,6 +161,19 @@ public function withArgs(?array $args = null): self
160161
return $self;
161162
}
162163

164+
public function getExtraArgs(): ?array
165+
{
166+
return $this->extraArgs;
167+
}
168+
169+
public function withExtraArgs(?array $extraArgs = null): self
170+
{
171+
$self = clone $this;
172+
$self->extraArgs = $extraArgs;
173+
174+
return $self;
175+
}
176+
163177
/**
164178
* @return Link[]|null
165179
*/

src/Metadata/GraphQl/Query.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class Query extends Operation
2121
public function __construct(
2222
?string $resolver = null,
2323
?array $args = null,
24+
?array $extraArgs = null,
2425
?array $links = null,
2526

2627
?string $shortName = null,
@@ -74,6 +75,7 @@ public function __construct(
7475
parent::__construct(
7576
resolver: $resolver,
7677
args: $args,
78+
extraArgs: $extraArgs,
7779
links: $links,
7880
shortName: $shortName,
7981
class: $class,

src/Metadata/GraphQl/QueryCollection.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ final class QueryCollection extends Query implements CollectionOperationInterfac
2222
public function __construct(
2323
?string $resolver = null,
2424
?array $args = null,
25+
?array $extraArgs = null,
2526
?array $links = null,
2627

2728
?string $shortName = null,
@@ -75,6 +76,7 @@ public function __construct(
7576
parent::__construct(
7677
resolver: $resolver,
7778
args: $args,
79+
extraArgs: $extraArgs,
7880
links: $links,
7981
shortName: $shortName,
8082
class: $class,

src/Metadata/GraphQl/Subscription.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ final class Subscription extends Operation
2121
public function __construct(
2222
?string $resolver = null,
2323
?array $args = null,
24+
?array $extraArgs = null,
2425
?array $links = null,
2526

2627
?string $shortName = null,
@@ -72,6 +73,7 @@ public function __construct(
7273
parent::__construct(
7374
resolver: $resolver,
7475
args: $args,
76+
extraArgs: $extraArgs,
7577
links: $links,
7678
shortName: $shortName,
7779
class: $class,

0 commit comments

Comments
 (0)