-
-
Notifications
You must be signed in to change notification settings - Fork 796
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Handle unresolvable interface fields and choose the best root field i…
…f there are many (#6141) Update poor-glasses-vanish.md ?? ?? Old Node support Reviews Point to the example Better typings instead of casting it Go Better comments
- Loading branch information
Showing
7 changed files
with
333 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
--- | ||
"@graphql-tools/federation": patch | ||
"@graphql-tools/stitch": patch | ||
--- | ||
|
||
When the gateway receives the query, now it chooses the best root field if there is the same root field in different subgraphs. | ||
For example, if there is `node(id: ID!): Node` in all subgraphs but one implements `User` and the other implements `Post`, the gateway will choose the subgraph that implements `User` or `Post` based on the query. | ||
|
||
If there is a unresolvable interface field, it throws. | ||
|
||
See [this supergraph and the test query](https://github.com/ardatan/graphql-tools/tree/master/packages/federation/test/fixtures/federation-compatibility/corrupted-supergraph-node-id) to see a real-life example |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
79 changes: 79 additions & 0 deletions
79
...on/test/fixtures/federation-compatibility/corrupted-supergraph-node-id/supergraph.graphql
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
schema | ||
@link(url: "https://specs.apollo.dev/link/v1.0") | ||
@link(url: "https://specs.apollo.dev/join/v0.3", for: EXECUTION) | ||
{ | ||
query: Query | ||
} | ||
|
||
directive @join__enumValue(graph: join__Graph!) repeatable on ENUM_VALUE | ||
|
||
directive @join__field(graph: join__Graph, requires: join__FieldSet, provides: join__FieldSet, type: String, external: Boolean, override: String, usedOverridden: Boolean) repeatable on FIELD_DEFINITION | INPUT_FIELD_DEFINITION | ||
|
||
directive @join__graph(name: String!, url: String!) on ENUM_VALUE | ||
|
||
directive @join__implements(graph: join__Graph!, interface: String!) repeatable on OBJECT | INTERFACE | ||
|
||
directive @join__type(graph: join__Graph!, key: join__FieldSet, extension: Boolean! = false, resolvable: Boolean! = true, isInterfaceObject: Boolean! = false) repeatable on OBJECT | INTERFACE | UNION | ENUM | INPUT_OBJECT | SCALAR | ||
|
||
directive @join__unionMember(graph: join__Graph!, member: String!) repeatable on UNION | ||
|
||
directive @link(url: String, as: String, for: link__Purpose, import: [link__Import]) repeatable on SCHEMA | ||
|
||
type Account implements Node | ||
@join__implements(graph: A, interface: "Node") | ||
@join__implements(graph: B, interface: "Node") | ||
@join__type(graph: A, key: "id") | ||
@join__type(graph: B, key: "id") | ||
{ | ||
id: ID! @join__field(graph: A) @join__field(graph: B, external: true) | ||
username: String! @join__field(graph: A) | ||
chats: [Chat!]! @join__field(graph: B) | ||
} | ||
|
||
type Chat implements Node | ||
@join__implements(graph: A, interface: "Node") | ||
@join__implements(graph: B, interface: "Node") | ||
@join__type(graph: A, key: "id") | ||
@join__type(graph: B, key: "id") | ||
{ | ||
id: ID! @join__field(graph: A, external: true) @join__field(graph: B) | ||
account: Account! @join__field(graph: A) | ||
text: String! @join__field(graph: B) | ||
} | ||
|
||
scalar join__FieldSet | ||
|
||
enum join__Graph { | ||
A @join__graph(name: "a", url: "https://federation-compatibility.the-guild.dev/corrupted-supergraph-node-id/a") | ||
B @join__graph(name: "b", url: "https://federation-compatibility.the-guild.dev/corrupted-supergraph-node-id/b") | ||
} | ||
|
||
scalar link__Import | ||
|
||
enum link__Purpose { | ||
""" | ||
`SECURITY` features provide metadata necessary to securely resolve fields. | ||
""" | ||
SECURITY | ||
|
||
""" | ||
`EXECUTION` features provide metadata necessary for operation execution. | ||
""" | ||
EXECUTION | ||
} | ||
|
||
interface Node | ||
@join__type(graph: A) | ||
@join__type(graph: B) | ||
{ | ||
id: ID! | ||
} | ||
|
||
type Query | ||
@join__type(graph: A) | ||
@join__type(graph: B) | ||
{ | ||
node(id: ID!): Node | ||
account(id: String!): Account @join__field(graph: A) | ||
chat(id: String!): Chat @join__field(graph: B) | ||
} |
Oops, something went wrong.