Skip to content

Commit 6df7030

Browse files
jturkelGoos
andauthored
feat: support @key directive resolvable argument (#249)
* Add resolvable argument to key annotation This adds support for federation 2.0's new [resolvable field](https://www.apollographql.com/docs/federation/federation-2/new-in-federation-2/#changes-to-key). * Add snippets about resolvable: false * Linter fix * Add test for unresolvable @key directive --------- Co-authored-by: Robin Goos <[email protected]>
1 parent 4d7154d commit 6df7030

File tree

3 files changed

+65
-5
lines changed

3 files changed

+65
-5
lines changed

README.md

+8
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,14 @@ class User < BaseObject
178178
end
179179
```
180180

181+
As well as non-resolvable keys:
182+
183+
```ruby
184+
class User < BaseObject
185+
key fields: :id, resolvable: false
186+
end
187+
```
188+
181189
See [field set syntax](#field-set-syntax) for more details on the format of the `fields` option.
182190

183191
### The `@external` directive

lib/apollo-federation/object.rb

+7-5
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,15 @@ def tag(name:)
3232
add_directive(name: 'tag', arguments: [name: 'name', values: name])
3333
end
3434

35-
def key(fields:, camelize: true)
35+
def key(fields:, camelize: true, resolvable: true)
36+
arguments = [
37+
name: 'fields',
38+
values: ApolloFederation::FieldSetSerializer.serialize(fields, camelize: camelize),
39+
]
40+
arguments.append(name: 'resolvable', values: resolvable) unless resolvable
3641
add_directive(
3742
name: 'key',
38-
arguments: [
39-
name: 'fields',
40-
values: ApolloFederation::FieldSetSerializer.serialize(fields, camelize: camelize),
41-
],
43+
arguments: arguments,
4244
)
4345
end
4446
end

spec/apollo-federation/service_field_v2_spec.rb

+50
Original file line numberDiff line numberDiff line change
@@ -1326,6 +1326,56 @@ def execute_sdl(schema)
13261326
)
13271327
end
13281328

1329+
it 'returns valid SDL for unresolvable @key directives' do
1330+
product = Class.new(base_object) do
1331+
graphql_name 'Product'
1332+
key fields: :upc, resolvable: false
1333+
1334+
field :upc, String, null: false
1335+
end
1336+
1337+
schema = Class.new(base_schema) do
1338+
orphan_types product
1339+
federation version: '2.0'
1340+
end
1341+
1342+
expect(execute_sdl(schema)).to match_sdl(
1343+
<<~GRAPHQL,
1344+
extend schema
1345+
@link(url: "https://specs.apollo.dev/federation/v2.3", import: ["@inaccessible", "@tag"])
1346+
1347+
type Product @federation__key(fields: "upc", resolvable: false) {
1348+
upc: String!
1349+
}
1350+
GRAPHQL
1351+
)
1352+
end
1353+
1354+
it 'returns valid SDL for resolvable @key directives' do
1355+
product = Class.new(base_object) do
1356+
graphql_name 'Product'
1357+
key fields: :upc, resolvable: true
1358+
1359+
field :upc, String, null: false
1360+
end
1361+
1362+
schema = Class.new(base_schema) do
1363+
orphan_types product
1364+
federation version: '2.0'
1365+
end
1366+
1367+
expect(execute_sdl(schema)).to match_sdl(
1368+
<<~GRAPHQL,
1369+
extend schema
1370+
@link(url: "https://specs.apollo.dev/federation/v2.3", import: ["@inaccessible", "@tag"])
1371+
1372+
type Product @federation__key(fields: "upc") {
1373+
upc: String!
1374+
}
1375+
GRAPHQL
1376+
)
1377+
end
1378+
13291379
it 'returns valid SDL for @external directives' do
13301380
product = Class.new(base_object) do
13311381
graphql_name 'Product'

0 commit comments

Comments
 (0)