Skip to content

Commit 983b5c7

Browse files
committed
Add Payload and input mutation type
1 parent be9ec1e commit 983b5c7

File tree

6 files changed

+117
-41
lines changed

6 files changed

+117
-41
lines changed

Definition/Builder/TypeBuilder.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,18 @@ private function getBaseClassName($type)
3737
$class = 'Overblog\\GraphBundle\\Relay\\Node\\NodeInterfaceType';
3838
break;
3939

40+
case 'input':
41+
$class = 'Overblog\\GraphBundle\\Relay\\Mutation\\InputType';
42+
break;
43+
44+
case 'payload':
45+
$class = 'Overblog\\GraphBundle\\Relay\\Mutation\\PayloadType';
46+
break;
47+
4048
case 'object':
4149
case 'enum':
4250
case 'interface':
4351
case 'union':
44-
case 'inputObject':
4552
$class = sprintf('GraphQL\\Type\\Definition\\%sType', ucfirst($type));
4653
break;
4754

DependencyInjection/Configuration.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public function getConfigTreeBuilder()
3131
->useAttributeAsKey('name')
3232
->prototype('array')
3333
->children()
34-
->enumNode('type')->values(['object', 'enum', 'interface', 'union', 'inputObject', 'connection', 'node'])
34+
->enumNode('type')->values(['object', 'enum', 'interface', 'union', 'input', 'payload','connection', 'node'])
3535
->isRequired()
3636
->end()
3737
->append($this->addConfigNode())
@@ -155,15 +155,14 @@ private function addFieldsSelection($name, $enabledBuilder = true)
155155
->arrayNode('builderConfig')
156156
->children()
157157
->scalarNode('nodeInterfaceType')->end()
158-
->append($this->addFieldsSelection('inputFields', false))
159-
->append($this->addFieldsSelection('outputFields', false))
160158
->scalarNode('mutateAndGetPayload')->end()
161159
->scalarNode('typeName')->end()
162160
->scalarNode('idFetcher')->end()
163161
->scalarNode('typeResolver')->end()
164162
->scalarNode('argName')->end()
165163
->scalarNode('inputType')->end()
166164
->scalarNode('outputType')->end()
165+
->scalarNode('payloadType')->end()
167166
->scalarNode('resolveSingleInput')->end()
168167
->scalarNode('description')->end()
169168
->end()

Relay/Mutation/InputType.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
namespace Overblog\GraphBundle\Relay\Mutation;
4+
5+
use GraphQL\Type\Definition\InputObjectType;
6+
use GraphQL\Type\Definition\Config;
7+
use GraphQL\Type\Definition\FieldDefinition;
8+
use GraphQL\Type\Definition\Type;
9+
use GraphQL\Utils;
10+
use Overblog\GraphBundle\Definition\MergeFieldTrait;
11+
12+
class InputType extends InputObjectType
13+
{
14+
use MergeFieldTrait;
15+
16+
public function __construct(array $config)
17+
{
18+
Utils::invariant(!empty($config['name']), 'Every type is expected to have name');
19+
20+
Config::validate($config, [
21+
'name' => Config::STRING | Config::REQUIRED,
22+
'fields' => Config::arrayOf(
23+
FieldDefinition::getDefinition(),
24+
Config::KEY_AS_NAME
25+
),
26+
'description' => Config::STRING
27+
]);
28+
29+
$description = isset($config['description']) ? $config['description'] : null;
30+
$inputFields = isset($config['fields']) ? $config['fields'] : [];
31+
32+
$augmentedInputFields = $this->getFieldsWithDefaults(
33+
$inputFields,
34+
[
35+
'clientMutationId' => ['type' => Type::nonNull(Type::string())]
36+
]
37+
);
38+
39+
$name = str_replace('Input', '', $config['name']);
40+
if (empty($name)) {
41+
$name = $config['name'];
42+
}
43+
44+
parent::__construct([
45+
'name' => $name . 'Input',
46+
'fields' => $augmentedInputFields,
47+
'description' => $description
48+
]);
49+
}
50+
}

Relay/Mutation/MutationField.php

Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -21,52 +21,23 @@ public function toFieldsDefinition(array $config)
2121

2222
Config::validate($config, [
2323
'name' => Config::STRING | Config::REQUIRED,
24-
'inputFields' => Config::arrayOf(
25-
FieldDefinition::getDefinition(),
26-
Config::KEY_AS_NAME
27-
),
28-
'outputFields' => Config::arrayOf(
29-
FieldDefinition::getDefinition(),
30-
Config::KEY_AS_NAME
31-
),
3224
'mutateAndGetPayload' => Config::CALLBACK | Config::REQUIRED,
25+
'payloadType' => Config::OBJECT_TYPE | Config::CALLBACK | Config::REQUIRED,
26+
'inputType' => Config::INPUT_TYPE | Config::CALLBACK | Config::REQUIRED,
3327
'description' => Config::STRING
3428
]);
3529

3630
$name = $config['name'];
37-
$inputFields = isset($config['inputFields']) ? $config['inputFields'] : [];
38-
$outputFields = isset($config['outputFields']) ? $config['outputFields'] : [];
31+
3932
$mutateAndGetPayload = $config['mutateAndGetPayload'];
4033
$description = isset($config['description']) ? $config['description'] : null;
41-
42-
$augmentedInputFields = $this->getFieldsWithDefaults(
43-
$inputFields,
44-
[
45-
'clientMutationId' => ['type' => Type::nonNull(Type::string())]
46-
]
47-
);
48-
49-
$augmentedOutputFields = $this->getFieldsWithDefaults(
50-
$outputFields,
51-
[
52-
'clientMutationId' => ['type' => Type::nonNull(Type::string())]
53-
]
54-
);
55-
56-
$outputType = new ObjectType([
57-
'name' => $name . 'Payload',
58-
'fields' => $augmentedOutputFields,
59-
]);
60-
61-
$inputType = new InputObjectType([
62-
'name' => $name . 'Input',
63-
'fields' => $augmentedInputFields,
64-
]);
34+
$payloadType = $config['payloadType'];
35+
$inputType = $config['inputType'];
6536

6637
return [
6738
'name' => $name,
6839
'description' => $description,
69-
'type' => $outputType,
40+
'type' => $payloadType,
7041
'args' => [
7142
'input' => ['type' => Type::nonNull($inputType)]
7243
],

Relay/Mutation/PayloadType.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
namespace Overblog\GraphBundle\Relay\Mutation;
4+
5+
use GraphQL\Type\Definition\ObjectType;
6+
use GraphQL\Type\Definition\Config;
7+
use GraphQL\Type\Definition\FieldDefinition;
8+
use GraphQL\Type\Definition\Type;
9+
use GraphQL\Utils;
10+
use Overblog\GraphBundle\Definition\MergeFieldTrait;
11+
12+
class PayloadType extends ObjectType
13+
{
14+
use MergeFieldTrait;
15+
16+
public function __construct(array $config)
17+
{
18+
Utils::invariant(!empty($config['name']), 'Every type is expected to have name');
19+
20+
Config::validate($config, [
21+
'name' => Config::STRING | Config::REQUIRED,
22+
'fields' => Config::arrayOf(
23+
FieldDefinition::getDefinition(),
24+
Config::KEY_AS_NAME
25+
),
26+
'description' => Config::STRING
27+
]);
28+
29+
$description = isset($config['description']) ? $config['description'] : null;
30+
$outputFields = isset($config['fields']) ? $config['fields'] : [];
31+
32+
$augmentedOutputFields = $this->getFieldsWithDefaults(
33+
$outputFields,
34+
[
35+
'clientMutationId' => ['type' => Type::nonNull(Type::string())]
36+
]
37+
);
38+
39+
$name = str_replace('Payload', '', $config['name']);
40+
if (empty($name)) {
41+
$name = $config['name'];
42+
}
43+
44+
parent::__construct([
45+
'name' => $name . 'Payload',
46+
'fields' => $augmentedOutputFields,
47+
'description' => $description
48+
]);
49+
}
50+
}

Resolver/ConfigResolver.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,12 @@ public function __construct(
5656
'nodeType' => [$this, 'resolveTypeCallback'],
5757
'connectionFields' => [$this, 'resolveFields'],
5858
'edgeFields' => [$this, 'resolveFields'],
59-
'outputFields' => [$this, 'resolveFields'],
60-
'inputFields' => [$this, 'resolveFields'],
6159
'mutateAndGetPayload' => [$this, 'resolveResolveCallback'],
6260
'idFetcher' => [$this, 'resolveResolveCallback'],
6361
'nodeInterfaceType' => [$this, 'resolveTypeCallback'],
6462
'inputType' => [$this, 'resolveTypeCallback'],
6563
'outputType' => [$this, 'resolveTypeCallback'],
64+
'payloadType' => [$this, 'resolveTypeCallback'],
6665
'resolveSingleInput' => [$this, 'resolveResolveCallback'],
6766
];
6867
}

0 commit comments

Comments
 (0)