Skip to content

Commit e4868f9

Browse files
authored
[federation] fix non-federated schema SDL (#1322)
When generating federated base schema (i.e. without extended types), we were manually adding invalid required federated types (e.g. directive definitions). Generated federated schema was correct when directives were generated from the annotations. Manually added federated directives were incorrectly specifying their arguments as nullable `_FieldSet`. SDL is printed as a debug information at a startup and can also be generated using one of our plugins. Depenendng how you use this federated SDL, this may or may not be a problem - Apollo federation 1.0 does not allow re-definition of the types across schemas so federated system types have to be scrubbed from published schema SDL and at runtime relies on `_service` query that returns modified SDL (again without federated directives). Resolves: #1310
1 parent d217c14 commit e4868f9

File tree

7 files changed

+20
-19
lines changed

7 files changed

+20
-19
lines changed

generator/graphql-kotlin-federation/src/main/kotlin/com/expediagroup/graphql/generator/federation/directives/FieldSet.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.expediagroup.graphql.generator.federation.directives
1818

1919
import com.expediagroup.graphql.generator.federation.types.FIELD_SET_SCALAR_TYPE
2020
import graphql.schema.GraphQLArgument
21+
import graphql.schema.GraphQLNonNull
2122

2223
/**
2324
* Annotation representing _FieldSet scalar type that is used to represent a set of fields.
@@ -37,5 +38,5 @@ internal const val FIELD_SET_ARGUMENT_NAME = "fields"
3738

3839
internal val FIELD_SET_ARGUMENT = GraphQLArgument.newArgument()
3940
.name(FIELD_SET_ARGUMENT_NAME)
40-
.type(FIELD_SET_SCALAR_TYPE)
41+
.type(GraphQLNonNull(FIELD_SET_SCALAR_TYPE))
4142
.build()

generator/graphql-kotlin-federation/src/test/kotlin/com/expediagroup/graphql/generator/federation/FederatedSchemaGeneratorTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,13 +179,13 @@ class FederatedSchemaGeneratorTest {
179179
directive @external on FIELD_DEFINITION
180180
181181
"Specifies required input field set from the base type for a resolver"
182-
directive @requires(fields: _FieldSet) on FIELD_DEFINITION
182+
directive @requires(fields: _FieldSet!) on FIELD_DEFINITION
183183
184184
"Specifies the base type field set that will be selectable by the gateway"
185-
directive @provides(fields: _FieldSet) on FIELD_DEFINITION
185+
directive @provides(fields: _FieldSet!) on FIELD_DEFINITION
186186
187187
"Space separated list of primary keys needed to access federated object"
188-
directive @key(fields: _FieldSet) on OBJECT | INTERFACE
188+
directive @key(fields: _FieldSet!) on OBJECT | INTERFACE
189189
190190
"Marks target object as extending part of the federated schema"
191191
directive @extends on OBJECT | INTERFACE

plugins/graphql-kotlin-gradle-plugin/src/test/kotlin/com/expediagroup/graphql/plugin/gradle/GraphQLGradlePluginIT.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -548,13 +548,13 @@ class GraphQLGradlePluginIT : GraphQLGradlePluginAbstractIT() {
548548
directive @external on FIELD_DEFINITION
549549
550550
"Specifies required input field set from the base type for a resolver"
551-
directive @requires(fields: _FieldSet) on FIELD_DEFINITION
551+
directive @requires(fields: _FieldSet!) on FIELD_DEFINITION
552552
553553
"Specifies the base type field set that will be selectable by the gateway"
554-
directive @provides(fields: _FieldSet) on FIELD_DEFINITION
554+
directive @provides(fields: _FieldSet!) on FIELD_DEFINITION
555555
556556
"Space separated list of primary keys needed to access federated object"
557-
directive @key(fields: _FieldSet) on OBJECT | INTERFACE
557+
directive @key(fields: _FieldSet!) on OBJECT | INTERFACE
558558
559559
"Marks target object as extending part of the federated schema"
560560
directive @extends on OBJECT | INTERFACE

plugins/graphql-kotlin-gradle-plugin/src/test/kotlin/com/expediagroup/graphql/plugin/gradle/tasks/GraphQLGenerateSDLTaskIT.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,13 +97,13 @@ internal val FEDERATED_SCHEMA =
9797
directive @external on FIELD_DEFINITION
9898
9999
"Specifies required input field set from the base type for a resolver"
100-
directive @requires(fields: _FieldSet) on FIELD_DEFINITION
100+
directive @requires(fields: _FieldSet!) on FIELD_DEFINITION
101101
102102
"Specifies the base type field set that will be selectable by the gateway"
103-
directive @provides(fields: _FieldSet) on FIELD_DEFINITION
103+
directive @provides(fields: _FieldSet!) on FIELD_DEFINITION
104104
105105
"Space separated list of primary keys needed to access federated object"
106-
directive @key(fields: _FieldSet) on OBJECT | INTERFACE
106+
directive @key(fields: _FieldSet!) on OBJECT | INTERFACE
107107
108108
"Marks target object as extending part of the federated schema"
109109
directive @extends on OBJECT | INTERFACE

plugins/graphql-kotlin-maven-plugin/src/integration/generate-sdl-federated/src/test/kotlin/com/expediagroup/graphql/plugin/maven/GenerateSDLMojoTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,13 @@ class GenerateSDLMojoTest {
6868
directive @external on FIELD_DEFINITION
6969
7070
"Specifies required input field set from the base type for a resolver"
71-
directive @requires(fields: _FieldSet) on FIELD_DEFINITION
71+
directive @requires(fields: _FieldSet!) on FIELD_DEFINITION
7272
7373
"Specifies the base type field set that will be selectable by the gateway"
74-
directive @provides(fields: _FieldSet) on FIELD_DEFINITION
74+
directive @provides(fields: _FieldSet!) on FIELD_DEFINITION
7575
7676
"Space separated list of primary keys needed to access federated object"
77-
directive @key(fields: _FieldSet) on OBJECT | INTERFACE
77+
directive @key(fields: _FieldSet!) on OBJECT | INTERFACE
7878
7979
"Marks target object as extending part of the federated schema"
8080
directive @extends on OBJECT | INTERFACE

plugins/graphql-kotlin-maven-plugin/src/integration/generate-sdl-hooks/src/test/kotlin/com/expediagroup/graphql/plugin/maven/GenerateSDLMojoTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,13 @@ class GenerateSDLMojoTest {
6868
directive @external on FIELD_DEFINITION
6969
7070
"Specifies required input field set from the base type for a resolver"
71-
directive @requires(fields: _FieldSet) on FIELD_DEFINITION
71+
directive @requires(fields: _FieldSet!) on FIELD_DEFINITION
7272
7373
"Specifies the base type field set that will be selectable by the gateway"
74-
directive @provides(fields: _FieldSet) on FIELD_DEFINITION
74+
directive @provides(fields: _FieldSet!) on FIELD_DEFINITION
7575
7676
"Space separated list of primary keys needed to access federated object"
77-
directive @key(fields: _FieldSet) on OBJECT | INTERFACE
77+
directive @key(fields: _FieldSet!) on OBJECT | INTERFACE
7878
7979
"Marks target object as extending part of the federated schema"
8080
directive @extends on OBJECT | INTERFACE

plugins/schema/graphql-kotlin-sdl-generator/src/integrationTest/kotlin/com/expediagroup/graphql/plugin/schema/GenerateCustomSDLTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,13 +57,13 @@ class GenerateCustomSDLTest {
5757
directive @external on FIELD_DEFINITION
5858
5959
"Specifies required input field set from the base type for a resolver"
60-
directive @requires(fields: _FieldSet) on FIELD_DEFINITION
60+
directive @requires(fields: _FieldSet!) on FIELD_DEFINITION
6161
6262
"Specifies the base type field set that will be selectable by the gateway"
63-
directive @provides(fields: _FieldSet) on FIELD_DEFINITION
63+
directive @provides(fields: _FieldSet!) on FIELD_DEFINITION
6464
6565
"Space separated list of primary keys needed to access federated object"
66-
directive @key(fields: _FieldSet) on OBJECT | INTERFACE
66+
directive @key(fields: _FieldSet!) on OBJECT | INTERFACE
6767
6868
"Marks target object as extending part of the federated schema"
6969
directive @extends on OBJECT | INTERFACE

0 commit comments

Comments
 (0)