graphiti 1.2.17 → 1.2.25
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 +4 -4
- data/CHANGELOG.md +1 -1
- data/Gemfile +2 -0
- data/Guardfile +1 -1
- data/graphiti.gemspec +1 -2
- data/lib/graphiti/adapters/active_record.rb +1 -1
- data/lib/graphiti/adapters/active_record/many_to_many_sideload.rb +21 -1
- data/lib/graphiti/debugger.rb +8 -4
- data/lib/graphiti/delegates/pagination.rb +5 -1
- data/lib/graphiti/extensions/extra_attribute.rb +1 -1
- data/lib/graphiti/query.rb +28 -12
- data/lib/graphiti/request_validator.rb +6 -6
- data/lib/graphiti/request_validators/validator.rb +7 -1
- data/lib/graphiti/resource.rb +10 -0
- data/lib/graphiti/resource/configuration.rb +6 -1
- data/lib/graphiti/resource/dsl.rb +6 -0
- data/lib/graphiti/resource/interface.rb +2 -2
- data/lib/graphiti/resource_proxy.rb +3 -1
- data/lib/graphiti/runner.rb +4 -4
- data/lib/graphiti/serializer.rb +7 -0
- data/lib/graphiti/sideload.rb +4 -0
- data/lib/graphiti/sideload/has_many.rb +19 -1
- data/lib/graphiti/sideload/many_to_many.rb +6 -2
- data/lib/graphiti/util/link.rb +1 -1
- data/lib/graphiti/version.rb +1 -1
- metadata +12 -20
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d5f2ffef76f6dd895acddc9a4d2deb374a3d217c94d0c85fd1feb40ecac9f369
|
|
4
|
+
data.tar.gz: c6ce48631bf54161b0678ac5d16a8e25b49c8259ec1405138559814745569129
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0e9d797893dfad771fbfe3400fc66e5830b80e8b029a059fdc12102c904e9d535b004fb08bb4501ce190effdda6f247b476ada10c6f0f6f4d963bcb0c971ab50
|
|
7
|
+
data.tar.gz: 5a933a0b8174449530858b06081eb09cd181d1d02f37f5befaac0e1f3dd16bf420e2e6e72d2c64a4750fd8ff2eaf3e2e333b59843c01ac613fa0c10e3e02ef0e
|
data/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
## Unreleased
|
|
2
2
|
|
|
3
3
|
Features:
|
|
4
|
-
|
|
4
|
+
- [242](https://github.com/graphiti-api/graphiti/pull/242) Bump `jsonapi-renderer` to `~0.2.2` now that (https://github.com/jsonapi-rb/jsonapi-renderer/pull/36) is fixed.
|
|
5
5
|
- [158](https://github.com/graphiti-api/graphiti/pull/158) Filters options `allow_nil: true`
|
|
6
6
|
Option can be set at the resource level `Resource.filters_accept_nil_by_default = true`.
|
|
7
7
|
By default this is set to false. (@zeisler)
|
data/Gemfile
CHANGED
data/Guardfile
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
guard :rspec, cmd: "bundle exec rspec --color --format documentation" do
|
|
2
2
|
require "guard/rspec/dsl"
|
|
3
3
|
dsl = Guard::RSpec::Dsl.new(self)
|
|
4
|
-
watch(%r{^spec/(.*)
|
|
4
|
+
watch(%r{^spec/(.*)/?(.*)_spec\.rb$})
|
|
5
5
|
|
|
6
6
|
# Feel free to open issues for suggestions and improvements
|
|
7
7
|
|
data/graphiti.gemspec
CHANGED
|
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
|
19
19
|
spec.required_ruby_version = "~> 2.3"
|
|
20
20
|
|
|
21
21
|
spec.add_dependency "jsonapi-serializable", "~> 0.3.0"
|
|
22
|
-
spec.add_dependency "jsonapi-renderer", "0.2.
|
|
22
|
+
spec.add_dependency "jsonapi-renderer", "~> 0.2", ">= 0.2.2"
|
|
23
23
|
spec.add_dependency "dry-types", ">= 0.15.0", "< 2.0"
|
|
24
24
|
spec.add_dependency "graphiti_errors", "~> 1.1.0"
|
|
25
25
|
spec.add_dependency "concurrent-ruby", "~> 1.0"
|
|
@@ -31,5 +31,4 @@ Gem::Specification.new do |spec|
|
|
|
31
31
|
spec.add_development_dependency "rake", "~> 10.0"
|
|
32
32
|
spec.add_development_dependency "activemodel", ">= 4.1"
|
|
33
33
|
spec.add_development_dependency "graphiti_spec_helpers", "1.0.beta.4"
|
|
34
|
-
spec.add_development_dependency "standard"
|
|
35
34
|
end
|
|
@@ -159,7 +159,7 @@ module Graphiti
|
|
|
159
159
|
|
|
160
160
|
# Ensure fractional seconds don't matter
|
|
161
161
|
def filter_datetime_eq(scope, attribute, value, is_not: false)
|
|
162
|
-
ranges = value.map { |v| (v..v + 1.second - 0.00000001) }
|
|
162
|
+
ranges = value.map { |v| (v..v + 1.second - 0.00000001) unless v.nil? }
|
|
163
163
|
clause = {attribute => ranges}
|
|
164
164
|
is_not ? scope.where.not(clause) : scope.where(clause)
|
|
165
165
|
end
|
|
@@ -8,6 +8,18 @@ class Graphiti::Adapters::ActiveRecord::ManyToManySideload < Graphiti::Sideload:
|
|
|
8
8
|
foreign_key.keys.first
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
+
def inverse_filter
|
|
12
|
+
return @inverse_filter if @inverse_filter
|
|
13
|
+
|
|
14
|
+
inferred_name = infer_inverse_association
|
|
15
|
+
|
|
16
|
+
if inferred_name
|
|
17
|
+
"#{inferred_name.to_s.singularize}_id"
|
|
18
|
+
else
|
|
19
|
+
super
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
11
23
|
def belongs_to_many_filter(scope, value)
|
|
12
24
|
if polymorphic?
|
|
13
25
|
clauses = value.group_by { |v| v["type"] }.map { |group|
|
|
@@ -36,7 +48,8 @@ class Graphiti::Adapters::ActiveRecord::ManyToManySideload < Graphiti::Sideload:
|
|
|
36
48
|
|
|
37
49
|
def filter_for(scope, value, type = nil)
|
|
38
50
|
scope
|
|
39
|
-
.
|
|
51
|
+
.preload(through_relationship_name)
|
|
52
|
+
.joins(through_relationship_name)
|
|
40
53
|
.where(belongs_to_many_clause(value, type))
|
|
41
54
|
end
|
|
42
55
|
|
|
@@ -75,4 +88,11 @@ class Graphiti::Adapters::ActiveRecord::ManyToManySideload < Graphiti::Sideload:
|
|
|
75
88
|
value = through_reflection.foreign_key.to_sym
|
|
76
89
|
{key => value}
|
|
77
90
|
end
|
|
91
|
+
|
|
92
|
+
def infer_inverse_association
|
|
93
|
+
through_class = through_reflection.klass
|
|
94
|
+
|
|
95
|
+
foreign_reflection = through_class.reflections[name.to_s.singularize]
|
|
96
|
+
foreign_reflection && foreign_reflection.options[:inverse_of]
|
|
97
|
+
end
|
|
78
98
|
end
|
data/lib/graphiti/debugger.rb
CHANGED
|
@@ -10,6 +10,8 @@ module Graphiti
|
|
|
10
10
|
|
|
11
11
|
class << self
|
|
12
12
|
def on_data(name, start, stop, id, payload)
|
|
13
|
+
return [] unless enabled
|
|
14
|
+
|
|
13
15
|
took = ((stop - start) * 1000.0).round(2)
|
|
14
16
|
params = scrub_params(payload[:params])
|
|
15
17
|
|
|
@@ -24,7 +26,7 @@ module Graphiti
|
|
|
24
26
|
end
|
|
25
27
|
end
|
|
26
28
|
|
|
27
|
-
def on_data_exception(payload, params)
|
|
29
|
+
private def on_data_exception(payload, params)
|
|
28
30
|
unless payload[:exception_object].instance_variable_get(:@__graphiti_debug)
|
|
29
31
|
add_chunk do |logs, json|
|
|
30
32
|
logs << ["\n=== Graphiti Debug ERROR", :red, true]
|
|
@@ -49,11 +51,11 @@ module Graphiti
|
|
|
49
51
|
end
|
|
50
52
|
end
|
|
51
53
|
|
|
52
|
-
def results(raw_results)
|
|
54
|
+
private def results(raw_results)
|
|
53
55
|
raw_results.map { |r| "[#{r.class.name}, #{r.id.inspect}]" }.join(", ")
|
|
54
56
|
end
|
|
55
57
|
|
|
56
|
-
def on_sideload_data(payload, params, took)
|
|
58
|
+
private def on_sideload_data(payload, params, took)
|
|
57
59
|
sideload = payload[:sideload]
|
|
58
60
|
results = results(payload[:results])
|
|
59
61
|
add_chunk(payload[:resource], payload[:parent]) do |logs, json|
|
|
@@ -72,7 +74,7 @@ module Graphiti
|
|
|
72
74
|
end
|
|
73
75
|
end
|
|
74
76
|
|
|
75
|
-
def on_primary_data(payload, params, took)
|
|
77
|
+
private def on_primary_data(payload, params, took)
|
|
76
78
|
results = results(payload[:results])
|
|
77
79
|
add_chunk(payload[:resource], payload[:parent]) do |logs, json|
|
|
78
80
|
logs << [""]
|
|
@@ -90,6 +92,8 @@ module Graphiti
|
|
|
90
92
|
end
|
|
91
93
|
|
|
92
94
|
def on_render(name, start, stop, id, payload)
|
|
95
|
+
return [] unless enabled
|
|
96
|
+
|
|
93
97
|
add_chunk do |logs|
|
|
94
98
|
took = ((stop - start) * 1000.0).round(2)
|
|
95
99
|
logs << [""]
|
|
@@ -20,13 +20,17 @@ module Graphiti
|
|
|
20
20
|
|
|
21
21
|
private
|
|
22
22
|
|
|
23
|
+
def pagination_params
|
|
24
|
+
@pagination_params ||= @proxy.query.params.reject { |key, _| [:action, :controller, :format].include?(key) }
|
|
25
|
+
end
|
|
26
|
+
|
|
23
27
|
def pagination_link(page)
|
|
24
28
|
return nil unless @proxy.resource.endpoint
|
|
25
29
|
|
|
26
30
|
uri = URI(@proxy.resource.endpoint[:url].to_s)
|
|
27
31
|
|
|
28
32
|
# Overwrite the pagination query params with the desired page
|
|
29
|
-
uri.query =
|
|
33
|
+
uri.query = pagination_params.merge({
|
|
30
34
|
page: {
|
|
31
35
|
number: page,
|
|
32
36
|
size: page_size
|
data/lib/graphiti/query.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
module Graphiti
|
|
2
2
|
class Query
|
|
3
|
-
attr_reader :resource, :association_name, :params
|
|
3
|
+
attr_reader :resource, :association_name, :params, :action
|
|
4
4
|
|
|
5
|
-
def initialize(resource, params, association_name = nil, nested_include = nil, parents = [])
|
|
5
|
+
def initialize(resource, params, association_name = nil, nested_include = nil, parents = [], action = nil)
|
|
6
6
|
@resource = resource
|
|
7
7
|
@association_name = association_name
|
|
8
8
|
@params = params
|
|
@@ -11,6 +11,7 @@ module Graphiti
|
|
|
11
11
|
@params = @params.deep_symbolize_keys
|
|
12
12
|
@include_param = nested_include || @params[:include]
|
|
13
13
|
@parents = parents
|
|
14
|
+
@action = parse_action(action)
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def association?
|
|
@@ -44,16 +45,19 @@ module Graphiti
|
|
|
44
45
|
|
|
45
46
|
def hash
|
|
46
47
|
@hash ||= {}.tap do |h|
|
|
47
|
-
h[:filter] = filters
|
|
48
|
-
h[:sort] = sorts
|
|
49
|
-
h[:page] = pagination
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
h[:extra_fields] = extra_fields
|
|
48
|
+
h[:filter] = filters
|
|
49
|
+
h[:sort] = sorts
|
|
50
|
+
h[:page] = pagination
|
|
51
|
+
if association?
|
|
52
|
+
resource_type = @resource.class.type
|
|
53
|
+
h[:extra_fields] = {resource_type => extra_fields[resource_type]} if extra_fields.key?(resource_type)
|
|
54
|
+
else
|
|
55
|
+
h[:fields] = fields
|
|
56
|
+
h[:extra_fields] = extra_fields
|
|
53
57
|
end
|
|
54
|
-
h[:stats] = stats
|
|
55
|
-
h[:include] = sideload_hash
|
|
56
|
-
end
|
|
58
|
+
h[:stats] = stats
|
|
59
|
+
h[:include] = sideload_hash
|
|
60
|
+
end.reject { |_, value| value.empty? }
|
|
57
61
|
end
|
|
58
62
|
|
|
59
63
|
def zero_results?
|
|
@@ -92,7 +96,7 @@ module Graphiti
|
|
|
92
96
|
sl_resource = resource_for_sideload(sideload)
|
|
93
97
|
query_parents = parents + [self]
|
|
94
98
|
sub_hash = sub_hash[:include] if sub_hash.key?(:include)
|
|
95
|
-
hash[key] = Query.new(sl_resource, @params, key, sub_hash, query_parents)
|
|
99
|
+
hash[key] = Query.new(sl_resource, @params, key, sub_hash, query_parents, :all)
|
|
96
100
|
else
|
|
97
101
|
handle_missing_sideload(key)
|
|
98
102
|
end
|
|
@@ -312,5 +316,17 @@ module Graphiti
|
|
|
312
316
|
end
|
|
313
317
|
end
|
|
314
318
|
end
|
|
319
|
+
|
|
320
|
+
def parse_action(action)
|
|
321
|
+
action ||= @params.fetch(:action, Graphiti.context[:namespace]).try(:to_sym)
|
|
322
|
+
case action
|
|
323
|
+
when :index
|
|
324
|
+
:all
|
|
325
|
+
when :show
|
|
326
|
+
:find
|
|
327
|
+
else
|
|
328
|
+
action
|
|
329
|
+
end
|
|
330
|
+
end
|
|
315
331
|
end
|
|
316
332
|
end
|
|
@@ -6,18 +6,18 @@ module Graphiti
|
|
|
6
6
|
:deserialized_payload,
|
|
7
7
|
to: :@validator
|
|
8
8
|
|
|
9
|
-
def initialize(root_resource, raw_params)
|
|
10
|
-
@validator = ValidatorFactory.create(root_resource, raw_params)
|
|
9
|
+
def initialize(root_resource, raw_params, action)
|
|
10
|
+
@validator = ValidatorFactory.create(root_resource, raw_params, action)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
class ValidatorFactory
|
|
14
|
-
def self.create(root_resource, raw_params)
|
|
15
|
-
case
|
|
16
|
-
when
|
|
14
|
+
def self.create(root_resource, raw_params, action)
|
|
15
|
+
case action
|
|
16
|
+
when :update then
|
|
17
17
|
RequestValidators::UpdateValidator
|
|
18
18
|
else
|
|
19
19
|
RequestValidators::Validator
|
|
20
|
-
end.new(root_resource, raw_params)
|
|
20
|
+
end.new(root_resource, raw_params, action)
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
end
|
|
@@ -3,10 +3,11 @@ module Graphiti
|
|
|
3
3
|
class Validator
|
|
4
4
|
attr_reader :errors
|
|
5
5
|
|
|
6
|
-
def initialize(root_resource, raw_params)
|
|
6
|
+
def initialize(root_resource, raw_params, action)
|
|
7
7
|
@root_resource = root_resource
|
|
8
8
|
@raw_params = raw_params
|
|
9
9
|
@errors = Graphiti::Util::SimpleErrors.new(raw_params)
|
|
10
|
+
@action = action
|
|
10
11
|
end
|
|
11
12
|
|
|
12
13
|
def validate
|
|
@@ -68,6 +69,11 @@ module Graphiti
|
|
|
68
69
|
|
|
69
70
|
def typecast_attributes(resource, attributes, payload_path)
|
|
70
71
|
attributes.each_pair do |key, value|
|
|
72
|
+
# Only validate id if create action, otherwise it's only used for lookup
|
|
73
|
+
next if @action != :create &&
|
|
74
|
+
key == :id &&
|
|
75
|
+
resource.class.config[:attributes][:id][:writable] == false
|
|
76
|
+
|
|
71
77
|
begin
|
|
72
78
|
attributes[key] = resource.typecast(key, value, :writable)
|
|
73
79
|
rescue Graphiti::Errors::UnknownAttribute
|
data/lib/graphiti/resource.rb
CHANGED
|
@@ -148,5 +148,15 @@ module Graphiti
|
|
|
148
148
|
end
|
|
149
149
|
response
|
|
150
150
|
end
|
|
151
|
+
|
|
152
|
+
def links?
|
|
153
|
+
self.class.links.any?
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def links(model)
|
|
157
|
+
self.class.links.each_with_object({}) do |(name, blk), memo|
|
|
158
|
+
memo[name] = instance_exec(model, &blk)
|
|
159
|
+
end
|
|
160
|
+
end
|
|
151
161
|
end
|
|
152
162
|
end
|
|
@@ -199,7 +199,8 @@ module Graphiti
|
|
|
199
199
|
attributes: {},
|
|
200
200
|
extra_attributes: {},
|
|
201
201
|
sideloads: {},
|
|
202
|
-
callbacks: {}
|
|
202
|
+
callbacks: {},
|
|
203
|
+
links: {}
|
|
203
204
|
}
|
|
204
205
|
end
|
|
205
206
|
|
|
@@ -238,6 +239,10 @@ module Graphiti
|
|
|
238
239
|
def default_filters
|
|
239
240
|
config[:default_filters]
|
|
240
241
|
end
|
|
242
|
+
|
|
243
|
+
def links
|
|
244
|
+
config[:links]
|
|
245
|
+
end
|
|
241
246
|
end
|
|
242
247
|
|
|
243
248
|
def get_attr!(name, flag, options = {})
|
|
@@ -5,6 +5,7 @@ module Graphiti
|
|
|
5
5
|
|
|
6
6
|
class_methods do
|
|
7
7
|
def filter(name, *args, &blk)
|
|
8
|
+
name = name.to_sym
|
|
8
9
|
opts = args.extract_options!
|
|
9
10
|
type_override = args[0]
|
|
10
11
|
|
|
@@ -135,6 +136,7 @@ module Graphiti
|
|
|
135
136
|
filterable: false
|
|
136
137
|
}
|
|
137
138
|
options = defaults.merge(options)
|
|
139
|
+
attribute_option(options, :readable)
|
|
138
140
|
config[:extra_attributes][name] = options
|
|
139
141
|
apply_extra_attributes_to_serializer
|
|
140
142
|
end
|
|
@@ -147,6 +149,10 @@ module Graphiti
|
|
|
147
149
|
end
|
|
148
150
|
end
|
|
149
151
|
|
|
152
|
+
def link(name, &blk)
|
|
153
|
+
config[:links][name.to_sym] = blk
|
|
154
|
+
end
|
|
155
|
+
|
|
150
156
|
def all_attributes
|
|
151
157
|
attributes.merge(extra_attributes)
|
|
152
158
|
end
|
|
@@ -11,7 +11,7 @@ module Graphiti
|
|
|
11
11
|
|
|
12
12
|
# @api private
|
|
13
13
|
def _all(params, opts, base_scope)
|
|
14
|
-
runner = Runner.new(self, params, opts.delete(:query))
|
|
14
|
+
runner = Runner.new(self, params, opts.delete(:query), :all)
|
|
15
15
|
opts[:params] = params
|
|
16
16
|
runner.proxy(base_scope, opts)
|
|
17
17
|
end
|
|
@@ -27,7 +27,7 @@ module Graphiti
|
|
|
27
27
|
params[:filter] ||= {}
|
|
28
28
|
params[:filter][:id] = id if id
|
|
29
29
|
|
|
30
|
-
runner = Runner.new(self, params)
|
|
30
|
+
runner = Runner.new(self, params, nil, :find)
|
|
31
31
|
runner.proxy base_scope,
|
|
32
32
|
single: true,
|
|
33
33
|
raise_on_missing: true,
|
|
@@ -93,7 +93,7 @@ module Graphiti
|
|
|
93
93
|
original = Graphiti.context[:namespace]
|
|
94
94
|
begin
|
|
95
95
|
Graphiti.context[:namespace] = action
|
|
96
|
-
::Graphiti::RequestValidator.new(@resource, @payload.params).validate!
|
|
96
|
+
::Graphiti::RequestValidator.new(@resource, @payload.params, action).validate!
|
|
97
97
|
validator = persist {
|
|
98
98
|
@resource.persist_with_relationships \
|
|
99
99
|
@payload.meta(action: action),
|
|
@@ -118,6 +118,7 @@ module Graphiti
|
|
|
118
118
|
end
|
|
119
119
|
|
|
120
120
|
def destroy
|
|
121
|
+
data
|
|
121
122
|
transaction_response = @resource.transaction do
|
|
122
123
|
metadata = {method: :destroy}
|
|
123
124
|
model = @resource.destroy(@query.filters[:id], metadata)
|
|
@@ -135,6 +136,7 @@ module Graphiti
|
|
|
135
136
|
end
|
|
136
137
|
|
|
137
138
|
def update_attributes
|
|
139
|
+
data
|
|
138
140
|
save(action: :update)
|
|
139
141
|
end
|
|
140
142
|
|
data/lib/graphiti/runner.rb
CHANGED
|
@@ -3,13 +3,13 @@ module Graphiti
|
|
|
3
3
|
attr_reader :params
|
|
4
4
|
attr_reader :deserialized_payload
|
|
5
5
|
|
|
6
|
-
def initialize(resource_class, params, query = nil)
|
|
6
|
+
def initialize(resource_class, params, query = nil, action = nil)
|
|
7
7
|
@resource_class = resource_class
|
|
8
8
|
@params = params
|
|
9
9
|
@query = query
|
|
10
|
+
@action = action
|
|
10
11
|
|
|
11
|
-
validator = RequestValidator.new(jsonapi_resource, params)
|
|
12
|
-
|
|
12
|
+
validator = RequestValidator.new(jsonapi_resource, params, action)
|
|
13
13
|
validator.validate!
|
|
14
14
|
|
|
15
15
|
@deserialized_payload = validator.deserialized_payload
|
|
@@ -30,7 +30,7 @@ module Graphiti
|
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
def query
|
|
33
|
-
@query ||= Query.new(jsonapi_resource, params)
|
|
33
|
+
@query ||= Query.new(jsonapi_resource, params, nil, nil, [], @action)
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
def query_hash
|
data/lib/graphiti/serializer.rb
CHANGED
|
@@ -25,6 +25,7 @@ module Graphiti
|
|
|
25
25
|
def as_jsonapi(*)
|
|
26
26
|
super.tap do |hash|
|
|
27
27
|
strip_relationships!(hash) if strip_relationships?
|
|
28
|
+
add_links!(hash)
|
|
28
29
|
end
|
|
29
30
|
end
|
|
30
31
|
|
|
@@ -49,6 +50,12 @@ module Graphiti
|
|
|
49
50
|
|
|
50
51
|
private
|
|
51
52
|
|
|
53
|
+
def add_links!(hash)
|
|
54
|
+
return unless @resource.respond_to?(:links?)
|
|
55
|
+
|
|
56
|
+
hash[:links] = @resource.links(@object) if @resource.links?
|
|
57
|
+
end
|
|
58
|
+
|
|
52
59
|
def strip_relationships!(hash)
|
|
53
60
|
hash[:relationships]&.select! do |name, payload|
|
|
54
61
|
payload.key?(:data)
|
data/lib/graphiti/sideload.rb
CHANGED
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
class Graphiti::Sideload::HasMany < Graphiti::Sideload
|
|
2
|
+
def initialize(name, opts)
|
|
3
|
+
@inverse_filter = opts[:inverse_filter]
|
|
4
|
+
|
|
5
|
+
super(name, opts)
|
|
6
|
+
end
|
|
7
|
+
|
|
2
8
|
def type
|
|
3
9
|
:has_many
|
|
4
10
|
end
|
|
5
11
|
|
|
12
|
+
def inverse_filter
|
|
13
|
+
@inverse_filter || foreign_key
|
|
14
|
+
end
|
|
15
|
+
|
|
6
16
|
def load_params(parents, query)
|
|
7
17
|
query.hash.tap do |hash|
|
|
8
18
|
hash[:filter] ||= {}
|
|
@@ -11,11 +21,19 @@ class Graphiti::Sideload::HasMany < Graphiti::Sideload
|
|
|
11
21
|
end
|
|
12
22
|
|
|
13
23
|
def base_filter(parents)
|
|
14
|
-
{foreign_key =>
|
|
24
|
+
{foreign_key => parent_filter(parents)}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def link_filter(parents)
|
|
28
|
+
{inverse_filter => parent_filter(parents)}
|
|
15
29
|
end
|
|
16
30
|
|
|
17
31
|
private
|
|
18
32
|
|
|
33
|
+
def parent_filter(parents)
|
|
34
|
+
ids_for_parents(parents).join(",")
|
|
35
|
+
end
|
|
36
|
+
|
|
19
37
|
def child_map(children)
|
|
20
38
|
children.group_by(&foreign_key)
|
|
21
39
|
end
|
|
@@ -11,8 +11,12 @@ class Graphiti::Sideload::ManyToMany < Graphiti::Sideload::HasMany
|
|
|
11
11
|
foreign_key.values.first
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
+
def inverse_filter
|
|
15
|
+
@inverse_filter || true_foreign_key
|
|
16
|
+
end
|
|
17
|
+
|
|
14
18
|
def base_filter(parents)
|
|
15
|
-
{true_foreign_key =>
|
|
19
|
+
{true_foreign_key => parent_filter(parents)}
|
|
16
20
|
end
|
|
17
21
|
|
|
18
22
|
def infer_foreign_key
|
|
@@ -32,7 +36,7 @@ class Graphiti::Sideload::ManyToMany < Graphiti::Sideload::HasMany
|
|
|
32
36
|
self_ref = self
|
|
33
37
|
fk_type = parent_resource_class.attributes[:id][:type]
|
|
34
38
|
fk_type = :hash if polymorphic?
|
|
35
|
-
resource_class.filter
|
|
39
|
+
resource_class.filter inverse_filter, fk_type do
|
|
36
40
|
eq do |scope, value|
|
|
37
41
|
self_ref.belongs_to_many_filter(scope, value)
|
|
38
42
|
end
|
data/lib/graphiti/util/link.rb
CHANGED
|
@@ -60,7 +60,7 @@ module Graphiti
|
|
|
60
60
|
def params
|
|
61
61
|
@params ||= {}.tap do |params|
|
|
62
62
|
if @sideload.type != :belongs_to || @sideload.remote?
|
|
63
|
-
params[:filter] = @sideload.
|
|
63
|
+
params[:filter] = @sideload.link_filter([@model])
|
|
64
64
|
end
|
|
65
65
|
|
|
66
66
|
@sideload.params_proc&.call(params, [@model], context)
|
data/lib/graphiti/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: graphiti
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.2.
|
|
4
|
+
version: 1.2.25
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Lee Richmond
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2020-
|
|
11
|
+
date: 2020-09-02 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: jsonapi-serializable
|
|
@@ -28,16 +28,22 @@ dependencies:
|
|
|
28
28
|
name: jsonapi-renderer
|
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
|
30
30
|
requirements:
|
|
31
|
-
- -
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0.2'
|
|
34
|
+
- - ">="
|
|
32
35
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: 0.2.
|
|
36
|
+
version: 0.2.2
|
|
34
37
|
type: :runtime
|
|
35
38
|
prerelease: false
|
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
40
|
requirements:
|
|
38
|
-
- -
|
|
41
|
+
- - "~>"
|
|
39
42
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: 0.2
|
|
43
|
+
version: '0.2'
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: 0.2.2
|
|
41
47
|
- !ruby/object:Gem::Dependency
|
|
42
48
|
name: dry-types
|
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -184,20 +190,6 @@ dependencies:
|
|
|
184
190
|
- - '='
|
|
185
191
|
- !ruby/object:Gem::Version
|
|
186
192
|
version: 1.0.beta.4
|
|
187
|
-
- !ruby/object:Gem::Dependency
|
|
188
|
-
name: standard
|
|
189
|
-
requirement: !ruby/object:Gem::Requirement
|
|
190
|
-
requirements:
|
|
191
|
-
- - ">="
|
|
192
|
-
- !ruby/object:Gem::Version
|
|
193
|
-
version: '0'
|
|
194
|
-
type: :development
|
|
195
|
-
prerelease: false
|
|
196
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
197
|
-
requirements:
|
|
198
|
-
- - ">="
|
|
199
|
-
- !ruby/object:Gem::Version
|
|
200
|
-
version: '0'
|
|
201
193
|
description:
|
|
202
194
|
email:
|
|
203
195
|
- richmolj@gmail.com
|