Skip to content

Commit 8d511d6

Browse files
committed
docs: adds docs for Interface Entities
1 parent 3b282f1 commit 8d511d6

File tree

1 file changed

+71
-2
lines changed

1 file changed

+71
-2
lines changed

README.md

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,20 @@ class Product < BaseObject
282282
end
283283
```
284284

285+
### The `@interfaceObject` directive (Apollo Federation v2.3)
286+
287+
[Apollo documentation](https://www.apollographql.com/docs/federation/federated-types/federated-directives/#interfaceobject)
288+
289+
Call `interface_object` within your class definition:
290+
291+
```ruby
292+
class Product < BaseObject
293+
interface_object
294+
key fields: :id
295+
field :id, ID, null: false
296+
end
297+
```
298+
285299
### The `@tag` directive (Apollo Federation v2)
286300

287301
[Apollo documentation](https://www.apollographql.com/docs/federation/federated-types/federated-directives/#tag)
@@ -327,7 +341,7 @@ Define a `resolve_reference` class method on your object. The method will be pas
327341
class User < BaseObject
328342
key fields: :user_id
329343
field :user_id, ID, null: false
330-
344+
331345
def self.resolve_reference(reference, context)
332346
USERS.find { |user| user[:userId] == reference[:userId] }
333347
end
@@ -341,7 +355,7 @@ class User < BaseObject
341355
key fields: :user_id
342356
field :user_id, ID, null: false
343357
underscore_reference_keys true
344-
358+
345359
def self.resolve_reference(reference, context)
346360
USERS.find { |user| user[:user_id] == reference[:user_id] }
347361
end
@@ -358,6 +372,61 @@ class BaseObject < GraphQL::Schema::Object
358372
end
359373
```
360374

375+
### Reference resolvers for Interfaces
376+
377+
[Apollo documentation](https://www.apollographql.com/docs/federation/federated-types/interfaces/#required-resolvers)
378+
379+
```ruby
380+
module Product
381+
include BaseInterface
382+
383+
key fields: :id
384+
field :id, ID, null: false
385+
field :title, String, null: true
386+
387+
definition_methods do
388+
def resolve_type(obj, _ctx)
389+
if obj.is_a?(Book)
390+
BookType
391+
elsif obj.is_a?(Movie)
392+
MovieType
393+
end
394+
395+
def resolve_reference(reference, _context)
396+
PRODUCTS.find { |product| product[:id] == reference[:id] }
397+
end
398+
end
399+
end
400+
401+
class BookType < BaseObject
402+
implements Product
403+
graphql_name 'Book'
404+
405+
key fields: :id
406+
field :id, ID, null: false
407+
field :title, String, null: true
408+
field :pages, Integer, null: true
409+
410+
def self.resolve_reference(reference, _context)
411+
BOOKS.find { |book| book[:id] == reference[:id] }
412+
end
413+
end
414+
415+
class MovieType < BaseObject
416+
implements Product
417+
graphql_name 'Movie'
418+
419+
key fields: :id
420+
field :id, ID, null: false
421+
field :title, String, null: true
422+
field :minutes, Integer, null: true
423+
424+
def self.resolve_reference(reference, _context)
425+
MOVIES.find { |movie| movie[:id] == reference[:id] }
426+
end
427+
end
428+
```
429+
361430
### Tracing
362431

363432
To support [federated tracing](https://www.apollographql.com/docs/apollo-server/federation/metrics/):

0 commit comments

Comments
 (0)