graphql-go / graphql-go/graphql

Automatic Delegation of Nested Field Resolvers to Root Query Resolvers

Open
#715 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
Go
Stars
10.1k
Forks
845
PR merge metrics
No merged PRs in 30d

Description

# Feature Request: Automatic Delegation of Nested Field Resolvers to Root Query Resolvers

## Description

Currently, when defining a nested field (e.g., the `creator` field in a type like `EstablishmentType`), you must explicitly specify a resolver for that field—even if a resolver for the same field is already defined in the root query. This forces developers to duplicate logic or centralize it in helper functions to maintain consistency.

## Current Behavior

- Each nested field is resolved independently using its own resolver (or the default resolver, which simply looks up the corresponding property on the source object).
- There is no built-in mechanism that automatically delegates the resolution of a nested field (e.g., `creator` in `EstablishmentType`) to the resolver defined in the root query for that field.

## Expected Behavior

- The library should automatically recognize, based on the field name, that if a resolver for `creator` is defined in the root query, it should be invoked automatically when resolving the nested `creator` field in other types.
- This behavior would eliminate the need to manually specify the same resolver logic in multiple places, reducing duplication and ensuring consistency.

## Proposed Implementation

- **Global Configuration Option:** Introduce a configuration flag in the library that enables automatic delegation of nested field resolvers to their corresponding root query resolvers.
- **Resolver Mapping:** When resolving a nested field, the library could look up a global mapping of resolvers (populated from the root query) and, if a matching resolver exists, delegate the resolution to it instead of using the default behavior.
- **Override Capability:** Allow this behavior to be overridden by explicitly defining a custom resolver on a nested field when necessary.

## Example

Assume you have the following root query resolver for `creator`:

```go
"creator": &graphql.Field{
Type: UserType,
Args: graphql.FieldConfigArgument{
"id": &graphql.ArgumentConfig{Type: graphql.NewNonNull(graphql.ID)},
},
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
// Logic to retrieve the user by their ID.
},
},
```

# 2. Nested Field in EstablishmentType
Now, consider an EstablishmentType that has a nested creator field. With the proposed feature, you would define the type without specifying an explicit resolver for creator:

```go
var EstablishmentType = graphql.NewObject(graphql.ObjectConfig{
Name: "Establishment",
Fields: graphql.Fields{
"id": &graphql.Field{
Type: graphql.ID,
},
"name": &graphql.Field{
Type: graphql.String,
},
"creator": &graphql.Field{
Type: UserType,
// No resolver is specified here; we expect the system to automatically delegate
// to the root query's "creator" resolver.
},
},
})
```

# 3. Expected Query Behavior
When a query like the following is executed:

```
graphql
{
establishment(id: "1") {
id
name
creator {
id
email
}
}
}

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.