Skip to content

Commit

Permalink
allow scopes to be added to hasMany relationships
Browse files Browse the repository at this point in the history
  • Loading branch information
chrissm79 committed Mar 14, 2018
1 parent 1d493ef commit 327dd80
Showing 1 changed file with 42 additions and 9 deletions.
51 changes: 42 additions & 9 deletions src/Schema/Directives/Fields/HasManyDirective.php
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public function handle(FieldValue $value)
);
default:
return $value->setResolver(
$this->defaultResolver($relation)
$this->defaultResolver($relation, $value)
);
}
}
Expand Down Expand Up @@ -104,6 +104,7 @@ protected function getResolver(FieldDefinitionNode $field)
*/
protected function connectionTypeResolver($relation, FieldValue $value)
{
$scopes = $this->getScopes($value);
$schema = sprintf(
'type Connection { connection(first: Int! after: String): String }
type %s { node: %s cursor: String! }
Expand Down Expand Up @@ -139,10 +140,14 @@ protected function connectionTypeResolver($relation, FieldValue $value)
}
});

return function ($parent, array $args, $context = null, ResolveInfo $info = null) use ($relation) {
return function ($parent, array $args, $context = null, ResolveInfo $info = null) use ($relation, $scopes) {
$builder = call_user_func([$parent, $relation]);

return $builder->relayConnection($args);
return $builder->when(! empty($scopes), function ($q) use ($scopes, $args) {
foreach ($scopes as $scope) {
call_user_func_array([$q, $scope], [$args]);
}
})->relayConnection($args);
};
}

Expand All @@ -156,6 +161,7 @@ protected function connectionTypeResolver($relation, FieldValue $value)
*/
protected function paginatorTypeResolver($relation, FieldValue $value)
{
$scopes = $this->getScopes($value);
$schema = sprintf(
'type Paginator { paginator(count: Int! page: Int): String }
type %s { paginatorInfo: PaginatorInfo! @field(class: "%s" method: "%s") data: [%s!]! @field(class: "%s" method: "%s") }',
Expand Down Expand Up @@ -188,27 +194,38 @@ protected function paginatorTypeResolver($relation, FieldValue $value)
}
});

return function ($parent, array $args, $context = null, ResolveInfo $info = null) use ($relation) {
return function ($parent, array $args, $context = null, ResolveInfo $info = null) use ($relation, $scopes) {
$builder = call_user_func([$parent, $relation]);

return $builder->paginatorConnection($args);
return $builder->when(! empty($scopes), function ($q) use ($scopes, $args) {
foreach ($scopes as $scope) {
call_user_func_array([$q, $scope], [$args]);
}
})->paginatorConnection($args);
};
}

/**
* Use default resolver for field.
*
* @param string $relation
* @param FieldValue $value
* @param string $relation
*
* @return \Closure
*/
protected function defaultResolver($relation)
protected function defaultResolver($relation, FieldValue $value)
{
return function ($parent, array $args) use ($relation) {
$scopes = $this->getScopes($value);

return function ($parent, array $args) use ($relation, $scopes) {
// TODO: Wrap w/ data loader to prevent N+1
$builder = call_user_func([$parent, $relation]);
// TODO: Create scopeGqlQuery scope to allow adjustments for $args.
return $builder->get();
return $builder->when(! empty($scopes), function ($q) use ($scopes, $args) {
foreach ($scopes as $scope) {
call_user_func_array([$q, $scope], [$args]);
}
})->get();
};
}

Expand Down Expand Up @@ -256,4 +273,20 @@ protected function connectionEdgeName(FieldValue $value)

return studly_case($parent.'_'.$child.'_Edge');
}

/**
* Get scope(s) to run on connection.
*
* @param FieldValue $value
*
* @return array
*/
protected function getScopes(FieldValue $value)
{
return $this->directiveArgValue(
$this->fieldDirective($value->getField(), 'hasMany'),
'scopes',
[]
);
}
}

0 comments on commit 327dd80

Please sign in to comment.