Skip to content

Commit 01b55b7

Browse files
authored
Merge pull request ConsultingMD#21 from thiagofelix/fix/issue-16
Add support for old/new graphql syntax API
2 parents 0433be8 + 03745fc commit 01b55b7

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

lib/graphql/preload.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@
22
require 'graphql/batch'
33
require 'promise.rb'
44

5+
GraphQL::Field.accepts_definitions(
6+
preload: ->(type, *args) do
7+
type.metadata[:preload] ||= []
8+
type.metadata[:preload].concat(args)
9+
end,
10+
preload_scope: ->(type, arg) { type.metadata[:preload_scope] = arg }
11+
)
12+
13+
GraphQL::Schema.accepts_definitions(
14+
enable_preloading: ->(schema) do
15+
schema.instrument(:field, GraphQL::Preload::Instrument.new)
16+
end
17+
)
18+
519
module GraphQL
620
# Provides a GraphQL::Field definition to preload ActiveRecord::Associations
721
module Preload

lib/graphql/preload/instrument.rb

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,22 @@ module Preload
33
# Provides an instrument for the GraphQL::Field :preload definition
44
class Instrument
55
def instrument(_type, field)
6-
return field unless field.metadata.include?(:preload)
6+
metadata = merged_metadata(field)
7+
return field if metadata.fetch(:preload, nil).nil?
78

89
old_resolver = field.resolve_proc
910
new_resolver = ->(obj, args, ctx) do
1011
return old_resolver.call(obj, args, ctx) unless obj
1112

12-
if field.metadata[:preload_scope]
13-
scope = field.metadata[:preload_scope].call(args, ctx)
13+
if metadata[:preload_scope]
14+
scope = metadata[:preload_scope].call(args, ctx)
1415
end
1516

16-
preload(obj.object, field.metadata[:preload], scope).then do
17+
is_graphql_object = obj.is_a?(GraphQL::Schema::Object)
18+
respond_to_object = obj.respond_to?(:object)
19+
record = is_graphql_object && respond_to_object ? obj.object : obj
20+
21+
preload(record, metadata[:preload], scope).then do
1722
old_resolver.call(obj, args, ctx)
1823
end
1924
end
@@ -77,6 +82,17 @@ def instrument(_type, field)
7782
loader.scope = scope
7883
loader.load(record)
7984
end
85+
86+
private def merged_metadata(field)
87+
type_class = field.metadata.fetch(:type_class, nil)
88+
89+
if type_class.nil? || !type_class.respond_to?(:to_graphql)
90+
field.metadata
91+
else
92+
field.metadata.merge(type_class.to_graphql.metadata)
93+
end
94+
end
95+
8096
end
8197
end
8298
end

0 commit comments

Comments
 (0)