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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 432533feee410a6ea882ec0362ff202b1c79f1bad917c1e24eb01fc83e4de147
|
4
|
+
data.tar.gz: 2dda92eb996d6152538d4575fbe7c6e72c8afeff4a66e150a422e9c2c2cc131b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29d66aab18e94862648b6e1385ccb74503b17c80c6a8c745abc2adfe4d394c93869b2b8fb272cad98f053613defff9d3c37730c51881126ae295c31fc811c023
|
7
|
+
data.tar.gz: badaf32c3b391fa21033fd0184b8785c607aa13837fbeeeef654f564f679267071e3a487d9dd1a1e8c7224b1f3b2b46006889456defa8cc6843abe470bb6586b
|
data/Gemfile.lock
CHANGED
@@ -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
|
-
|
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.
|
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
|
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.
|
184
|
+
type_registry[federated_resource.klass_name][:type],
|
165
185
|
null: true
|
166
186
|
end
|
167
187
|
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
|
+
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-
|
11
|
+
date: 2021-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: graphiti
|