Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Compose complex input arguments through nested arg resolvers #899

Merged
merged 81 commits into from
Dec 20, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
d770659
wip
spawnia Jul 24, 2019
de6464f
Merge branch 'master' into composable-input-arguments
spawnia Jul 24, 2019
29866f8
Apply fixes from StyleCI
spawnia Jul 25, 2019
137bdc8
Merge branch 'master' into composable-input-arguments
spawnia Jul 25, 2019
c960b18
Merge remote-tracking branch 'origin/composable-input-arguments' into…
spawnia Jul 25, 2019
7f4e868
Working TypedArgs
spawnia Jul 26, 2019
391461d
Apply fixes from StyleCI
spawnia Jul 26, 2019
62970fc
WIP
spawnia Aug 13, 2019
d4fdbd4
Apply fixes from StyleCI
spawnia Aug 13, 2019
b609602
Merge branch 'master' into composable-input-arguments
spawnia Aug 18, 2019
e79d1bd
wip
spawnia Aug 18, 2019
137de22
Merge remote-tracking branch 'origin/composable-input-arguments' into…
spawnia Aug 18, 2019
1b1305f
Apply fixes from StyleCI
spawnia Aug 18, 2019
96244f0
Merge branch 'master' into composable-input-arguments
spawnia Aug 21, 2019
9d4b410
wip
spawnia Aug 23, 2019
b7a1f10
Apply fixes from StyleCI
spawnia Aug 23, 2019
5065ab3
Simplify argument handling
spawnia Aug 23, 2019
b177208
Apply fixes from StyleCI
spawnia Aug 23, 2019
ccd26fc
Merge branch 'simplify-argument-handling' into composable-input-argum…
spawnia Aug 23, 2019
6af6833
merge
spawnia Aug 23, 2019
92c3e28
Apply fixes from StyleCI
spawnia Aug 23, 2019
fd37eef
wip
spawnia Aug 26, 2019
8c926f8
Apply fixes from StyleCI
spawnia Aug 26, 2019
5016838
Merge branch 'master' into composable-input-arguments
spawnia Sep 29, 2019
9811142
dev-master
spawnia Sep 29, 2019
d41919c
Merge branch 'master' into composable-input-arguments
spawnia Oct 2, 2019
eb0ab31
Merge branch 'master' into composable-input-arguments
spawnia Oct 11, 2019
a4309a1
Merge branch 'master' into composable-input-arguments
spawnia Oct 20, 2019
49b72c9
wip
spawnia Oct 20, 2019
4ce650a
Cleanup a bit, add a test
spawnia Oct 22, 2019
f2361bf
Merge branch 'master' into composable-input-arguments
spawnia Oct 25, 2019
53c6ee5
Somewhat working
spawnia Oct 26, 2019
88d2e7e
Apply fixes from StyleCI
spawnia Oct 26, 2019
b078bd6
Simplify and cleanup
spawnia Oct 26, 2019
d55e0fd
Apply fixes from StyleCI
spawnia Oct 26, 2019
fcda06c
Unify NestedOneToMany
spawnia Oct 26, 2019
e97da48
Replace MutationExecutor
spawnia Oct 26, 2019
a90dfae
Apply fixes from StyleCI
spawnia Oct 26, 2019
08b1c44
Fix InjectDirective
spawnia Oct 27, 2019
9677a57
Apply fixes from StyleCI
spawnia Oct 27, 2019
7fa31b6
Improve ArgPartitioner and tests
spawnia Oct 27, 2019
8747330
Apply fixes from StyleCI
spawnia Oct 27, 2019
ecd7c3d
Extract duplicate code
spawnia Oct 27, 2019
1f9f379
Flip partition order to align with Laravel, extract functions
spawnia Oct 28, 2019
5ec62d5
Apply fixes from StyleCI
spawnia Oct 28, 2019
5310ebb
Actually implement nested argument resolvers
spawnia Oct 28, 2019
0506377
Apply fixes from StyleCI
spawnia Oct 28, 2019
a949d85
Improve docs/comments
spawnia Oct 31, 2019
8f0f331
Make ArgPartitioner functions "partition" and "methodReturnsRelation"…
spawnia Nov 7, 2019
e4aad75
Apply fixes from StyleCI
spawnia Nov 7, 2019
943477d
Allow supplying a custom ArgPartitioner in ResolveNested
spawnia Nov 7, 2019
fe045b8
Merge branch 'master' into composable-input-arguments
spawnia Nov 7, 2019
d23a832
Merge branch 'master' into composable-input-arguments
spawnia Nov 13, 2019
637a817
Add syncWithoutDetaching
spawnia Nov 13, 2019
8c27554
Merge branch 'master' into composable-input-arguments
spawnia Nov 22, 2019
bcd9c92
Merge branch 'master' into composable-input-arguments
spawnia Nov 26, 2019
6d044c3
Merge branch 'master' into composable-input-arguments
spawnia Nov 27, 2019
697fd1d
Rename ArgumentResolver to ArgResolver
spawnia Nov 27, 2019
641103d
Apply fixes from StyleCI
spawnia Nov 27, 2019
55e1a4b
Add concepts section
spawnia Nov 27, 2019
e14629f
Add on to arg-resolvers.md
spawnia Dec 1, 2019
8147993
Add concepts to sidebar
spawnia Dec 6, 2019
7400549
Unify MutationExecutorDirective.php implementations and dedupe code
spawnia Dec 6, 2019
071a563
Merge branch 'master' into composable-input-arguments
spawnia Dec 12, 2019
f9bcea0
Merge branch 'master' into composable-input-arguments
spawnia Dec 13, 2019
ceec762
Also dissociate BelongsTo in nested operations
spawnia Dec 13, 2019
de40e46
Update docs
spawnia Dec 13, 2019
888723e
Merge branch 'master' into composable-input-arguments
spawnia Dec 13, 2019
8dad6d7
Add CHANGELOG.md
spawnia Dec 13, 2019
629a5cf
Merge branch 'master' into composable-input-arguments
spawnia Dec 13, 2019
08f374c
Associate nested belongs to models to their children after saving
spawnia Dec 13, 2019
d9e32b9
Apply fixes from StyleCI
spawnia Dec 13, 2019
ef7c8ac
Use nodeName()
spawnia Dec 13, 2019
b806de3
Add explanatory example to arg-resolvers.md
spawnia Dec 17, 2019
9f90760
Use lang GraphQL
spawnia Dec 19, 2019
36862a2
Use just a boolean in nested @delete when there is only one possible …
spawnia Dec 19, 2019
579fb13
Apply fixes from StyleCI
spawnia Dec 19, 2019
f842b7a
Add fallback to nodeName in nested arg delete directive
spawnia Dec 19, 2019
5f94033
Revert experimental createOrUpdate in nested HasOne
spawnia Dec 19, 2019
a1447e6
Merge branch 'master' into composable-input-arguments
spawnia Dec 20, 2019
2ef82ce
Add detailed CHANGELOG.md
spawnia Dec 20, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
wip
  • Loading branch information
spawnia committed Jul 24, 2019
commit d7706598857883b755c857538ecb1474e100f225
10 changes: 10 additions & 0 deletions src/Execution/Arguments/AfterResolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Nuwave\Lighthouse\Execution\Arguments;

use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;

interface AfterResolver
{
public function resolve($root, $value, GraphQLContext $context);
}
23 changes: 23 additions & 0 deletions src/Execution/Arguments/TypedArgs.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

namespace Nuwave\Lighthouse\Execution\Arguments;

use GraphQL\Type\Definition\InputType;

class TypedArgs extends \ArrayObject
{
public function __construct($input = array(), $flags = 0, $iterator_class = "ArrayIterator")
{
parent::__construct($input, $flags, $iterator_class);
}

public static function fromArgs(array $input, )
{

}

public function type(string $offset): InputType
{
$this->
}
}
110 changes: 110 additions & 0 deletions src/Schema/Directives/ArgResolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<?php

namespace Nuwave\Lighthouse\Schema\Directives;

use GraphQL\Type\Definition\FieldDefinition;
use Illuminate\Support\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\DatabaseManager;
use GraphQL\Type\Definition\ResolveInfo;
use Nuwave\Lighthouse\Execution\Arguments\AfterResolver;
use Nuwave\Lighthouse\Schema\Extensions\ArgumentExtensions;
use Nuwave\Lighthouse\Schema\Values\FieldValue;
use Nuwave\Lighthouse\Execution\MutationExecutor;
use Nuwave\Lighthouse\Support\Contracts\FieldResolver;
use Nuwave\Lighthouse\Support\Contracts\GraphQLContext;

class CreateDirective extends BaseDirective implements FieldResolver
{
/**
* @var \Illuminate\Database\DatabaseManager
*/
protected $databaseManager;

/**
* @param \Illuminate\Database\DatabaseManager $databaseManager
* @return void
*/
public function __construct(DatabaseManager $databaseManager)
{
$this->databaseManager = $databaseManager;
}

/**
* Name of the directive.
*
* @return string
*/
public function name(): string
{
return 'create';
}

/**
* Resolve the field directive.
*
* @param \Nuwave\Lighthouse\Schema\Values\FieldValue $fieldValue
* @return \Nuwave\Lighthouse\Schema\Values\FieldValue
*/
public function resolveField(FieldValue $fieldValue): FieldValue
{
return $fieldValue->setResolver(
function ($root, array $args, GraphQLContext $context, ResolveInfo $resolveInfo): Model {
[$afterResolvers, $regular] = $this->partitionArguments($args, $resolveInfo->fieldDefinition);

$modelClassName = $this->getModelClass();
/** @var \Illuminate\Database\Eloquent\Model $model */
$model = new $modelClassName($regular);
$model->save();

/** @var AfterResolver $afterResolver */
foreach($afterResolvers as $afterResolver){
$afterResolver->resolve($model, $args, $context);
}
$executeMutation = function () use ($model, $args): Model {
return MutationExecutor::executeCreate($model, new Collection($args))->refresh();
};

return config('lighthouse.transactional_mutations', true)
? $this->databaseManager->connection($model->getConnectionName())->transaction($executeMutation)
: $executeMutation();
}
);
}

protected function partitionResolverInputs(array $args, $definitions): array
{
return $this->partitionArguments($args, $definitions, function(ArgumentExtensions $argumentExtensions){
return $argumentExtensions->resolver instanceof AfterResolver;
});
}

/**
* @param array $args
* @param \GraphQL\Type\Definition\FieldArgument[]|\GraphQL\Type\Definition\InputObjectField[] $definitions
*/
protected function partitionArguments(array $args, $definitions, callable $isSpecial)
{
$special = [];
$regular = [];

foreach($args as $name => $value){
$argDef = $definitions['name'];
/** @var \Nuwave\Lighthouse\Schema\Extensions\ArgumentExtensions $config */
$config = $argDef->config['lighthouse'];
$isSpecial($config)
? $special[$name] = $value
: $regular[$name] = $value;
}

return [
$special,
$regular,
];
}

public static function defaultArgResolver($root, $value)
{
$root->value;
}
}
8 changes: 8 additions & 0 deletions src/Schema/Extensions/ArgumentExtensions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

namespace Nuwave\Lighthouse\Schema\Extensions;

class ArgumentExtensions
{
public $resolver;
}