graphiti_graphql 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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