jsonapi-resources 0.10.0.beta3 → 0.10.0.beta4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/jsonapi-resources.rb +4 -2
- data/lib/jsonapi/{active_relation_resource_finder → active_relation}/adapters/join_left_active_record_adapter.rb +1 -1
- data/lib/jsonapi/{active_relation_resource_finder → active_relation}/join_manager.rb +1 -1
- data/lib/jsonapi/{active_relation_resource_finder.rb → active_relation_resource.rb} +96 -44
- data/lib/jsonapi/acts_as_resource_controller.rb +1 -1
- data/lib/jsonapi/basic_resource.rb +1137 -0
- data/lib/jsonapi/configuration.rb +4 -12
- data/lib/jsonapi/include_directives.rb +6 -8
- data/lib/jsonapi/link_builder.rb +100 -77
- data/lib/jsonapi/operation_result.rb +2 -2
- data/lib/jsonapi/processor.rb +6 -7
- data/lib/jsonapi/relationship.rb +26 -3
- data/lib/jsonapi/request_parser.rb +44 -10
- data/lib/jsonapi/resource.rb +3 -1106
- data/lib/jsonapi/resource_serializer.rb +35 -31
- data/lib/jsonapi/resource_set.rb +1 -1
- data/lib/jsonapi/resources/version.rb +1 -1
- data/lib/jsonapi/response_document.rb +7 -2
- data/lib/jsonapi/routing_ext.rb +16 -4
- metadata +22 -6
@@ -59,7 +59,7 @@ module JSONAPI
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
fail "
|
62
|
+
fail "Too many primary objects for show" if (primary_objects.count > 1)
|
63
63
|
primary_hash = { 'data' => primary_objects[0] }
|
64
64
|
|
65
65
|
primary_hash['included'] = included_objects if included_objects.size > 0
|
@@ -93,24 +93,19 @@ module JSONAPI
|
|
93
93
|
return serialize_resource_set_to_hash_plural(resource_set)
|
94
94
|
end
|
95
95
|
|
96
|
-
def
|
96
|
+
def serialize_to_relationship_hash(source, requested_relationship, resource_ids)
|
97
97
|
if requested_relationship.is_a?(JSONAPI::Relationship::ToOne)
|
98
98
|
data = to_one_linkage(resource_ids[0])
|
99
99
|
else
|
100
100
|
data = to_many_linkage(resource_ids)
|
101
101
|
end
|
102
102
|
|
103
|
-
{
|
104
|
-
'links' => {
|
105
|
-
'self' => self_link(source, requested_relationship),
|
106
|
-
'related' => related_link(source, requested_relationship)
|
107
|
-
},
|
108
|
-
'data' => data
|
109
|
-
}
|
110
|
-
end
|
103
|
+
rel_hash = { 'data': data }
|
111
104
|
|
112
|
-
|
113
|
-
|
105
|
+
links = default_relationship_links(source, requested_relationship)
|
106
|
+
rel_hash['links'] = links unless links.blank?
|
107
|
+
|
108
|
+
rel_hash
|
114
109
|
end
|
115
110
|
|
116
111
|
def format_key(key)
|
@@ -140,7 +135,6 @@ module JSONAPI
|
|
140
135
|
supplying_attribute_fields: supplying_attribute_fields(resource_klass).sort,
|
141
136
|
supplying_relationship_fields: supplying_relationship_fields(resource_klass).sort,
|
142
137
|
link_builder_base_url: link_builder.base_url,
|
143
|
-
route_formatter_class: link_builder.route_formatter.uncached.class.name,
|
144
138
|
key_formatter_class: key_formatter.uncached.class.name,
|
145
139
|
always_include_to_one_linkage_data: always_include_to_one_linkage_data,
|
146
140
|
always_include_to_many_linkage_data: always_include_to_many_linkage_data
|
@@ -165,7 +159,7 @@ module JSONAPI
|
|
165
159
|
obj_hash['attributes'] = source.attributes_json if source.attributes_json
|
166
160
|
|
167
161
|
relationships = cached_relationships_hash(source, fetchable_fields, relationship_data)
|
168
|
-
obj_hash['relationships'] = relationships unless relationships.
|
162
|
+
obj_hash['relationships'] = relationships unless relationships.blank?
|
169
163
|
|
170
164
|
obj_hash['meta'] = source.meta_json if source.meta_json
|
171
165
|
else
|
@@ -184,7 +178,7 @@ module JSONAPI
|
|
184
178
|
obj_hash['attributes'] = attributes unless attributes.empty?
|
185
179
|
|
186
180
|
relationships = relationships_hash(source, fetchable_fields, relationship_data)
|
187
|
-
obj_hash['relationships'] = relationships unless relationships.
|
181
|
+
obj_hash['relationships'] = relationships unless relationships.blank?
|
188
182
|
|
189
183
|
meta = meta_hash(source)
|
190
184
|
obj_hash['meta'] = meta unless meta.empty?
|
@@ -199,7 +193,7 @@ module JSONAPI
|
|
199
193
|
@_supplying_attribute_fields.fetch resource_klass do
|
200
194
|
attrs = Set.new(resource_klass._attributes.keys.map(&:to_sym))
|
201
195
|
cur = resource_klass
|
202
|
-
while cur
|
196
|
+
while !cur.root? # do not traverse beyond the first root resource
|
203
197
|
if @fields.has_key?(cur._type)
|
204
198
|
attrs &= @fields[cur._type]
|
205
199
|
break
|
@@ -214,7 +208,7 @@ module JSONAPI
|
|
214
208
|
@_supplying_relationship_fields.fetch resource_klass do
|
215
209
|
relationships = Set.new(resource_klass._relationships.keys.map(&:to_sym))
|
216
210
|
cur = resource_klass
|
217
|
-
while cur
|
211
|
+
while !cur.root? # do not traverse beyond the first root resource
|
218
212
|
if @fields.has_key?(cur._type)
|
219
213
|
relationships &= @fields[cur._type]
|
220
214
|
break
|
@@ -249,7 +243,9 @@ module JSONAPI
|
|
249
243
|
|
250
244
|
def links_hash(source)
|
251
245
|
links = custom_links_hash(source)
|
252
|
-
links
|
246
|
+
if !links.key?('self') && !source.class.exclude_link?(:self)
|
247
|
+
links['self'] = link_builder.self_link(source)
|
248
|
+
end
|
253
249
|
links.compact
|
254
250
|
end
|
255
251
|
|
@@ -274,7 +270,8 @@ module JSONAPI
|
|
274
270
|
end
|
275
271
|
end
|
276
272
|
|
277
|
-
|
273
|
+
ro = relationship_object(source, relationship, rids, include_data)
|
274
|
+
hash[format_key(name)] = ro unless ro.blank?
|
278
275
|
end
|
279
276
|
end
|
280
277
|
end
|
@@ -323,6 +320,13 @@ module JSONAPI
|
|
323
320
|
link_builder.relationships_related_link(source, relationship)
|
324
321
|
end
|
325
322
|
|
323
|
+
def default_relationship_links(source, relationship)
|
324
|
+
links = {}
|
325
|
+
links['self'] = self_link(source, relationship) unless relationship.exclude_link?(:self)
|
326
|
+
links['related'] = related_link(source, relationship) unless relationship.exclude_link?(:related)
|
327
|
+
links.compact
|
328
|
+
end
|
329
|
+
|
326
330
|
def to_many_linkage(rids)
|
327
331
|
linkage = []
|
328
332
|
|
@@ -346,36 +350,36 @@ module JSONAPI
|
|
346
350
|
}
|
347
351
|
end
|
348
352
|
|
349
|
-
def
|
353
|
+
def relationship_object_to_one(source, relationship, rid, include_data)
|
350
354
|
link_object_hash = {}
|
351
|
-
|
352
|
-
|
353
|
-
|
355
|
+
|
356
|
+
links = default_relationship_links(source, relationship)
|
357
|
+
|
358
|
+
link_object_hash['links'] = links unless links.blank?
|
354
359
|
link_object_hash['data'] = to_one_linkage(rid) if include_data
|
355
360
|
link_object_hash
|
356
361
|
end
|
357
362
|
|
358
|
-
def
|
363
|
+
def relationship_object_to_many(source, relationship, rids, include_data)
|
359
364
|
link_object_hash = {}
|
360
|
-
|
361
|
-
|
362
|
-
link_object_hash['links']
|
365
|
+
|
366
|
+
links = default_relationship_links(source, relationship)
|
367
|
+
link_object_hash['links'] = links unless links.blank?
|
363
368
|
link_object_hash['data'] = to_many_linkage(rids) if include_data
|
364
369
|
link_object_hash
|
365
370
|
end
|
366
371
|
|
367
|
-
def
|
372
|
+
def relationship_object(source, relationship, rid, include_data)
|
368
373
|
if relationship.is_a?(JSONAPI::Relationship::ToOne)
|
369
|
-
|
374
|
+
relationship_object_to_one(source, relationship, rid, include_data)
|
370
375
|
elsif relationship.is_a?(JSONAPI::Relationship::ToMany)
|
371
|
-
|
376
|
+
relationship_object_to_many(source, relationship, rid, include_data)
|
372
377
|
end
|
373
378
|
end
|
374
379
|
|
375
380
|
def generate_link_builder(primary_resource_klass, options)
|
376
381
|
LinkBuilder.new(
|
377
382
|
base_url: options.fetch(:base_url, ''),
|
378
|
-
route_formatter: options.fetch(:route_formatter, JSONAPI.configuration.route_formatter),
|
379
383
|
primary_resource_klass: primary_resource_klass,
|
380
384
|
)
|
381
385
|
end
|
data/lib/jsonapi/resource_set.rb
CHANGED
@@ -91,7 +91,7 @@ module JSONAPI
|
|
91
91
|
# Step Four find any of the missing resources and join them into the result
|
92
92
|
missed_resource_ids.each_pair do |resource_klass, ids|
|
93
93
|
find_opts = {context: context, fields: find_options[:fields]}
|
94
|
-
found_resources = resource_klass.
|
94
|
+
found_resources = resource_klass.find_to_populate_by_keys(ids, find_opts)
|
95
95
|
|
96
96
|
found_resources.each do |resource|
|
97
97
|
relationship_data = @resource_klasses[resource_klass][resource.id][:relationships]
|
@@ -118,10 +118,15 @@ module JSONAPI
|
|
118
118
|
result.pagination_params.each_pair do |link_name, params|
|
119
119
|
if result.is_a?(JSONAPI::RelatedResourcesSetOperationResult)
|
120
120
|
relationship = result.source_resource.class._relationships[result._type.to_sym]
|
121
|
-
|
121
|
+
unless relationship.exclude_link?(link_name)
|
122
|
+
link = serializer.link_builder.relationships_related_link(result.source_resource, relationship, query_params(params))
|
123
|
+
end
|
122
124
|
else
|
123
|
-
|
125
|
+
unless serializer.link_builder.primary_resource_klass.exclude_link?(link_name)
|
126
|
+
link = serializer.link_builder.query_link(query_params(params))
|
127
|
+
end
|
124
128
|
end
|
129
|
+
@top_level_links[link_name] = link unless link.blank?
|
125
130
|
end
|
126
131
|
end
|
127
132
|
end
|
data/lib/jsonapi/routing_ext.rb
CHANGED
@@ -20,6 +20,10 @@ module ActionDispatch
|
|
20
20
|
@resource_type = resources.first
|
21
21
|
res = JSONAPI::Resource.resource_klass_for(resource_type_with_module_prefix(@resource_type))
|
22
22
|
|
23
|
+
unless res.singleton?
|
24
|
+
warn "Singleton routes created for non singleton resource #{res}. Links may not be generated correctly."
|
25
|
+
end
|
26
|
+
|
23
27
|
options = resources.extract_options!.dup
|
24
28
|
options[:controller] ||= @resource_type
|
25
29
|
options.merge!(res.routing_resource_options)
|
@@ -80,6 +84,10 @@ module ActionDispatch
|
|
80
84
|
@resource_type = resources.first
|
81
85
|
res = JSONAPI::Resource.resource_klass_for(resource_type_with_module_prefix(@resource_type))
|
82
86
|
|
87
|
+
if res.singleton?
|
88
|
+
warn "Singleton resource #{res} should use `jsonapi_resource` instead."
|
89
|
+
end
|
90
|
+
|
83
91
|
options = resources.extract_options!.dup
|
84
92
|
options[:controller] ||= @resource_type
|
85
93
|
options.merge!(res.routing_resource_options)
|
@@ -154,7 +162,8 @@ module ActionDispatch
|
|
154
162
|
|
155
163
|
if methods.include?(:show)
|
156
164
|
match "relationships/#{formatted_relationship_name}", controller: options[:controller],
|
157
|
-
action: 'show_relationship', relationship: link_type.to_s, via: [:get]
|
165
|
+
action: 'show_relationship', relationship: link_type.to_s, via: [:get],
|
166
|
+
as: "relationships/#{link_type}"
|
158
167
|
end
|
159
168
|
|
160
169
|
if res.mutable?
|
@@ -182,7 +191,8 @@ module ActionDispatch
|
|
182
191
|
|
183
192
|
if methods.include?(:show)
|
184
193
|
match "relationships/#{formatted_relationship_name}", controller: options[:controller],
|
185
|
-
action: 'show_relationship', relationship: link_type.to_s, via: [:get]
|
194
|
+
action: 'show_relationship', relationship: link_type.to_s, via: [:get],
|
195
|
+
as: "relationships/#{link_type}"
|
186
196
|
end
|
187
197
|
|
188
198
|
if res.mutable?
|
@@ -221,7 +231,8 @@ module ActionDispatch
|
|
221
231
|
|
222
232
|
match formatted_relationship_name, controller: options[:controller],
|
223
233
|
relationship: relationship.name, source: resource_type_with_module_prefix(source._type),
|
224
|
-
action: 'show_related_resource', via: [:get]
|
234
|
+
action: 'show_related_resource', via: [:get],
|
235
|
+
as: relationship_name
|
225
236
|
end
|
226
237
|
|
227
238
|
def jsonapi_related_resources(*relationship)
|
@@ -238,7 +249,8 @@ module ActionDispatch
|
|
238
249
|
match formatted_relationship_name,
|
239
250
|
controller: options[:controller],
|
240
251
|
relationship: relationship.name, source: resource_type_with_module_prefix(source._type),
|
241
|
-
action: 'index_related_resources', via: [:get]
|
252
|
+
action: 'index_related_resources', via: [:get],
|
253
|
+
as: relationship_name
|
242
254
|
end
|
243
255
|
|
244
256
|
protected
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonapi-resources
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.0.
|
4
|
+
version: 0.10.0.beta4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dan Gebhardt
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-05-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -115,6 +115,20 @@ dependencies:
|
|
115
115
|
- - ">="
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
|
+
- !ruby/object:Gem::Dependency
|
119
|
+
name: database_cleaner
|
120
|
+
requirement: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
type: :development
|
126
|
+
prerelease: false
|
127
|
+
version_requirements: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
118
132
|
- !ruby/object:Gem::Dependency
|
119
133
|
name: activerecord
|
120
134
|
requirement: !ruby/object:Gem::Requirement
|
@@ -176,10 +190,11 @@ files:
|
|
176
190
|
- lib/generators/jsonapi/templates/jsonapi_controller.rb
|
177
191
|
- lib/generators/jsonapi/templates/jsonapi_resource.rb
|
178
192
|
- lib/jsonapi-resources.rb
|
179
|
-
- lib/jsonapi/
|
180
|
-
- lib/jsonapi/
|
181
|
-
- lib/jsonapi/
|
193
|
+
- lib/jsonapi/active_relation/adapters/join_left_active_record_adapter.rb
|
194
|
+
- lib/jsonapi/active_relation/join_manager.rb
|
195
|
+
- lib/jsonapi/active_relation_resource.rb
|
182
196
|
- lib/jsonapi/acts_as_resource_controller.rb
|
197
|
+
- lib/jsonapi/basic_resource.rb
|
183
198
|
- lib/jsonapi/cached_response_fragment.rb
|
184
199
|
- lib/jsonapi/callbacks.rb
|
185
200
|
- lib/jsonapi/compiled_json.rb
|
@@ -232,7 +247,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
232
247
|
- !ruby/object:Gem::Version
|
233
248
|
version: 1.3.1
|
234
249
|
requirements: []
|
235
|
-
|
250
|
+
rubyforge_project:
|
251
|
+
rubygems_version: 2.7.6
|
236
252
|
signing_key:
|
237
253
|
specification_version: 4
|
238
254
|
summary: Easily support JSON API in Rails.
|