graphiti_graphql 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5bee75fe735608862a522a16be4a9ab31900b45af74ff48d4294d114227bd543
4
- data.tar.gz: ade635fd51be3820845bfccb79bd17c2b5bcff0c961a930910299dda6c90fad2
3
+ metadata.gz: 432533feee410a6ea882ec0362ff202b1c79f1bad917c1e24eb01fc83e4de147
4
+ data.tar.gz: 2dda92eb996d6152538d4575fbe7c6e72c8afeff4a66e150a422e9c2c2cc131b
5
5
  SHA512:
6
- metadata.gz: e6720bf46431df3c5f5c2906fdf94aac13e4255cdfcdb2c2eb1fbd40d58bd2e28b231a9e2238d13e5ec7aaab9bd9ff60f86de9086972e90ec372bd12fe902978
7
- data.tar.gz: 0aff8b2e2459bd1c94b674dce2ce9e618f63c1b0dffc3fe49a1766c59b6aa692db2d14ca05d45747f990069d2bf39ee1ac3d9413732ba14c88ffeebbf20fa351
6
+ metadata.gz: 29d66aab18e94862648b6e1385ccb74503b17c80c6a8c745abc2adfe4d394c93869b2b8fb272cad98f053613defff9d3c37730c51881126ae295c31fc811c023
7
+ data.tar.gz: badaf32c3b391fa21033fd0184b8785c607aa13837fbeeeef654f564f679267071e3a487d9dd1a1e8c7224b1f3b2b46006889456defa8cc6843abe470bb6586b
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- graphiti_graphql (0.1.2)
4
+ graphiti_graphql (0.1.4)
5
5
  activesupport (>= 4.1)
6
6
  graphiti (>= 1.2.36)
7
7
  graphql (~> 1.12)
@@ -137,4 +137,4 @@ DEPENDENCIES
137
137
  standardrb
138
138
 
139
139
  BUNDLED WITH
140
- 2.0.2
140
+ 2.2.16
@@ -21,6 +21,18 @@ module GraphitiGraphQL
21
21
  @relationships[name].instance_eval(&blk)
22
22
  end
23
23
  end
24
+
25
+ def polymorphic?
26
+ @type_name.is_a?(Hash)
27
+ end
28
+
29
+ def klass_name
30
+ if polymorphic?
31
+ "I#{@relationships.keys[0].to_s.camelize}"
32
+ else
33
+ @type_name
34
+ end
35
+ end
24
36
  end
25
37
  end
26
38
  end
@@ -64,18 +64,30 @@ module GraphitiGraphQL
64
64
  # * Add to the list of external graphql-ruby types we need in schema
65
65
  # * Add a gql-specific attribute to the serializer that gives apollo
66
66
  # the representation it needs.
67
- def federated_belongs_to(name, type: nil, foreign_key: nil)
67
+ def federated_belongs_to(name, type: nil, foreign_key: nil, foreign_type: nil)
68
68
  type ||= name.to_s.camelize
69
69
  foreign_key ||= :"#{name.to_s.underscore}_id"
70
70
  resource = FederatedResource.new(type)
71
71
  federated_resources << resource
72
72
  resource.add_relationship(:belongs_to, name, self, foreign_key)
73
73
 
74
+ foreign_type ||= :"#{name.to_s.underscore}_type" if resource.polymorphic?
75
+
74
76
  opts = {readable: :gql?, only: [:readable], schema: false}
75
77
  attribute name, :hash, opts do
76
78
  prc = self.class.attribute_blocks[foreign_key]
77
79
  fk = prc ? instance_eval(&prc) : @object.send(foreign_key)
78
- {__typename: type, id: fk.to_s}
80
+
81
+ typename = type
82
+ if resource.polymorphic?
83
+ prc = self.class.attribute_blocks[foreign_type]
84
+ ft = prc ? instance_eval(&prc) : @object.send(foreign_type)
85
+ typename = type[ft]
86
+ end
87
+
88
+ if fk && typename.present?
89
+ {__typename: typename, id: fk.to_s}
90
+ end
79
91
  end
80
92
  end
81
93
  end
@@ -66,19 +66,39 @@ module GraphitiGraphQL
66
66
  pre_registered = !!type_registry[federated_resource.type_name]
67
67
  type_class = if pre_registered
68
68
  type_registry[federated_resource.type_name][:type]
69
+ elsif federated_resource.polymorphic?
70
+ add_federated_resource_interface(federated_resource)
69
71
  else
70
- add_federated_resource_type(federated_resource.type_name)
72
+ add_federated_resource_type(federated_resource.klass_name)
71
73
  end
72
74
 
73
75
  yield type_class, federated_resource
74
76
  end
75
77
  end
76
78
 
77
- def add_federated_resource_type(klass_name)
79
+ def add_federated_resource_interface(federated_resource)
80
+ interface = define_polymorphic_federated_resource_interface(federated_resource.klass_name)
81
+ federated_resource.type_name.values.each do |name|
82
+ add_federated_resource_type(name, interface: interface)
83
+ end
84
+ interface
85
+ end
86
+
87
+ def define_polymorphic_federated_resource_interface(klass_name)
88
+ interface = Module.new
89
+ interface.send(:include, @schema.class.base_interface)
90
+ interface.graphql_name(klass_name)
91
+ interface.field :id, String, null: false, external: true
92
+ type_registry[klass_name] = {type: interface, interface: true}
93
+ interface
94
+ end
95
+
96
+ def add_federated_resource_type(klass_name, interface: nil)
78
97
  federated_type = Class.new(@schema.class.base_object)
79
98
  federated_type.graphql_name klass_name
80
99
  federated_type.key(fields: "id")
81
100
  federated_type.extend_type
101
+ federated_type.implements(interface) if interface
82
102
  federated_type.field :id, String, null: false, external: true
83
103
  federated_type.class_eval do
84
104
  def self.resolve_reference(reference, _context, _lookup)
@@ -161,7 +181,7 @@ module GraphitiGraphQL
161
181
 
162
182
  local_types.each do |local|
163
183
  local.field relationship.name,
164
- type_registry[federated_resource.type_name][:type],
184
+ type_registry[federated_resource.klass_name][:type],
165
185
  null: true
166
186
  end
167
187
  end
@@ -1,3 +1,3 @@
1
1
  module GraphitiGraphQL
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphiti_graphql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lee Richmond
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-06-07 00:00:00.000000000 Z
11
+ date: 2021-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphiti