jsonapi-resources 0.9.0 → 0.9.1.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/jsonapi/exceptions.rb +10 -13
- data/lib/jsonapi/include_directives.rb +1 -1
- data/lib/jsonapi/processor.rb +4 -3
- data/lib/jsonapi/relationship_builder.rb +2 -4
- data/lib/jsonapi/request_parser.rb +45 -37
- data/lib/jsonapi/resource.rb +10 -4
- data/lib/jsonapi/resources/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31f232713ef6f5199ccbc94bccf4a0135fc287ae
|
4
|
+
data.tar.gz: bb5a0238e1b0027b4224eda64624b10e8e71cd6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: efb1ad213d3b6d67cf5d25c86a84a5cfa393fb7a4c69e6ad3249010bf21aae1b78941f575c4ee27a5fff2edb110edf43ebbcc8b65def43351a15b26f31cac23c
|
7
|
+
data.tar.gz: 1eef8ebb63b4bb177d327dc92a139fcc61728ff8955096af8e842341154bb5788ce09b7cedd484ee5b9f83a4a2316225f091034821770cf6261c590a2dc97d17
|
data/lib/jsonapi/exceptions.rb
CHANGED
@@ -364,24 +364,21 @@ module JSONAPI
|
|
364
364
|
end
|
365
365
|
end
|
366
366
|
|
367
|
-
class
|
368
|
-
attr_accessor :
|
367
|
+
class ParameterNotAllowed < Error
|
368
|
+
attr_accessor :param
|
369
369
|
|
370
|
-
def initialize(
|
371
|
-
@
|
370
|
+
def initialize(param, error_object_overrides = {})
|
371
|
+
@param = param
|
372
372
|
super(error_object_overrides)
|
373
373
|
end
|
374
374
|
|
375
375
|
def errors
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
default: "#{param} is not allowed.", param: param))
|
383
|
-
|
384
|
-
end
|
376
|
+
[create_error_object(code: JSONAPI::PARAM_NOT_ALLOWED,
|
377
|
+
status: :bad_request,
|
378
|
+
title: I18n.translate('jsonapi-resources.exceptions.parameter_not_allowed.title',
|
379
|
+
default: 'Param not allowed'),
|
380
|
+
detail: I18n.translate('jsonapi-resources.exceptions.parameter_not_allowed.detail',
|
381
|
+
default: "#{param} is not allowed.", param: param))]
|
385
382
|
end
|
386
383
|
end
|
387
384
|
|
@@ -52,7 +52,7 @@ module JSONAPI
|
|
52
52
|
current_relationship = current_resource_klass._relationships[fragment]
|
53
53
|
current_resource_klass = current_relationship.try(:resource_klass)
|
54
54
|
else
|
55
|
-
|
55
|
+
raise JSONAPI::Exceptions::InvalidInclude.new(current_resource_klass, current_path)
|
56
56
|
end
|
57
57
|
|
58
58
|
include_in_join = @force_eager_load || !current_relationship || current_relationship.eager_load_on_include
|
data/lib/jsonapi/processor.rb
CHANGED
@@ -100,7 +100,7 @@ module JSONAPI
|
|
100
100
|
end
|
101
101
|
|
102
102
|
if JSONAPI.configuration.top_level_links_include_pagination && paginator
|
103
|
-
page_options[:pagination_params] = paginator.links_page_params(page_options)
|
103
|
+
page_options[:pagination_params] = paginator.links_page_params(page_options.merge(fetched_resources: resource_records))
|
104
104
|
end
|
105
105
|
|
106
106
|
return JSONAPI::ResourcesOperationResult.new(:ok, resource_records, page_options)
|
@@ -166,9 +166,10 @@ module JSONAPI
|
|
166
166
|
include_directives = params[:include_directives]
|
167
167
|
|
168
168
|
source_resource ||= source_klass.find_by_key(source_id, context: context, fields: fields)
|
169
|
+
verified_filters = resource_klass.verify_filters(filters, context)
|
169
170
|
|
170
171
|
rel_opts = {
|
171
|
-
filters:
|
172
|
+
filters: verified_filters,
|
172
173
|
sort_criteria: sort_criteria,
|
173
174
|
paginator: paginator,
|
174
175
|
fields: fields,
|
@@ -209,7 +210,7 @@ module JSONAPI
|
|
209
210
|
pagination_params = if paginator && JSONAPI.configuration.top_level_links_include_pagination
|
210
211
|
page_options = {}
|
211
212
|
page_options[:record_count] = record_count if paginator.class.requires_record_count
|
212
|
-
paginator.links_page_params(page_options)
|
213
|
+
paginator.links_page_params(page_options.merge(fetched_resources: related_resources))
|
213
214
|
else
|
214
215
|
{}
|
215
216
|
end
|
@@ -66,10 +66,8 @@ module JSONAPI
|
|
66
66
|
end
|
67
67
|
|
68
68
|
sort_criteria = options.fetch(:sort_criteria, {})
|
69
|
-
|
70
|
-
|
71
|
-
records = resource_klass.apply_sort(records, order_options, @context)
|
72
|
-
end
|
69
|
+
order_options = relationship.resource_klass.construct_order_options(sort_criteria)
|
70
|
+
records = resource_klass.apply_sort(records, order_options, @context)
|
73
71
|
|
74
72
|
paginator = options[:paginator]
|
75
73
|
if paginator
|
@@ -170,13 +170,11 @@ module JSONAPI
|
|
170
170
|
end
|
171
171
|
type_resource = Resource.resource_for(@resource_klass.module_path + underscored_type.to_s)
|
172
172
|
rescue NameError
|
173
|
-
|
174
|
-
rescue JSONAPI::Exceptions::InvalidResource => e
|
175
|
-
@errors.concat(e.errors)
|
173
|
+
fail JSONAPI::Exceptions::InvalidResource.new(type)
|
176
174
|
end
|
177
175
|
|
178
176
|
if type_resource.nil?
|
179
|
-
|
177
|
+
fail JSONAPI::Exceptions::InvalidResource.new(type)
|
180
178
|
else
|
181
179
|
unless values.nil?
|
182
180
|
valid_fields = type_resource.fields.collect { |key| format_key(key) }
|
@@ -184,11 +182,11 @@ module JSONAPI
|
|
184
182
|
if valid_fields.include?(field)
|
185
183
|
extracted_fields[type].push unformat_key(field)
|
186
184
|
else
|
187
|
-
|
185
|
+
fail JSONAPI::Exceptions::InvalidField.new(type, field)
|
188
186
|
end
|
189
187
|
end
|
190
188
|
else
|
191
|
-
|
189
|
+
fail JSONAPI::Exceptions::InvalidField.new(type, 'nil')
|
192
190
|
end
|
193
191
|
end
|
194
192
|
end
|
@@ -205,8 +203,7 @@ module JSONAPI
|
|
205
203
|
check_include(Resource.resource_for(resource_klass.module_path + relationship.class_name.to_s.underscore), include_parts.last.partition('.'))
|
206
204
|
end
|
207
205
|
else
|
208
|
-
|
209
|
-
include_parts.first).errors)
|
206
|
+
fail JSONAPI::Exceptions::InvalidInclude.new(format_key(resource_klass._type), include_parts.first)
|
210
207
|
end
|
211
208
|
end
|
212
209
|
|
@@ -214,7 +211,7 @@ module JSONAPI
|
|
214
211
|
return unless raw_include
|
215
212
|
|
216
213
|
unless JSONAPI.configuration.allow_include
|
217
|
-
fail JSONAPI::Exceptions::
|
214
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(:include)
|
218
215
|
end
|
219
216
|
|
220
217
|
included_resources = []
|
@@ -226,19 +223,24 @@ module JSONAPI
|
|
226
223
|
|
227
224
|
return if included_resources.empty?
|
228
225
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
226
|
+
begin
|
227
|
+
result = included_resources.compact.map do |included_resource|
|
228
|
+
check_include(@resource_klass, included_resource.partition('.'))
|
229
|
+
unformat_key(included_resource).to_s
|
230
|
+
end
|
233
231
|
|
234
|
-
|
232
|
+
@include_directives = JSONAPI::IncludeDirectives.new(@resource_klass, result)
|
233
|
+
rescue JSONAPI::Exceptions::InvalidInclude => e
|
234
|
+
@errors.concat(e.errors)
|
235
|
+
@include_directives = {}
|
236
|
+
end
|
235
237
|
end
|
236
238
|
|
237
239
|
def parse_filters(filters)
|
238
240
|
return unless filters
|
239
241
|
|
240
242
|
unless JSONAPI.configuration.allow_filter
|
241
|
-
fail JSONAPI::Exceptions::
|
243
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(:filter)
|
242
244
|
end
|
243
245
|
|
244
246
|
unless filters.class.method_defined?(:each)
|
@@ -251,7 +253,7 @@ module JSONAPI
|
|
251
253
|
if @resource_klass._allowed_filter?(filter)
|
252
254
|
@filters[filter] = value
|
253
255
|
else
|
254
|
-
|
256
|
+
fail JSONAPI::Exceptions::FilterNotAllowed.new(filter)
|
255
257
|
end
|
256
258
|
end
|
257
259
|
end
|
@@ -267,7 +269,7 @@ module JSONAPI
|
|
267
269
|
return unless sort_criteria.present?
|
268
270
|
|
269
271
|
unless JSONAPI.configuration.allow_sort
|
270
|
-
fail JSONAPI::Exceptions::
|
272
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(:sort)
|
271
273
|
end
|
272
274
|
|
273
275
|
sorts = []
|
@@ -296,9 +298,8 @@ module JSONAPI
|
|
296
298
|
sort_field = sort_criteria[:field]
|
297
299
|
sortable_fields = resource_klass.sortable_fields(context)
|
298
300
|
|
299
|
-
unless sortable_fields.include?
|
300
|
-
|
301
|
-
.new(format_key(resource_klass._type), sort_field).errors)
|
301
|
+
unless sortable_fields.include?sort_field.to_sym
|
302
|
+
fail JSONAPI::Exceptions::InvalidSortCriteria.new(format_key(resource_klass._type), sort_field)
|
302
303
|
end
|
303
304
|
end
|
304
305
|
|
@@ -473,7 +474,7 @@ module JSONAPI
|
|
473
474
|
|
474
475
|
unless links_object[:id].nil?
|
475
476
|
resource = self.resource_klass || Resource
|
476
|
-
relationship_resource = resource.resource_for(unformat_key(links_object[:type]).to_s)
|
477
|
+
relationship_resource = resource.resource_for(unformat_key(relationship.options[:class_name] || links_object[:type]).to_s)
|
477
478
|
relationship_id = relationship_resource.verify_key(links_object[:id], @context)
|
478
479
|
if relationship.polymorphic?
|
479
480
|
{ id: relationship_id, type: unformat_key(links_object[:type].to_s) }
|
@@ -528,8 +529,10 @@ module JSONAPI
|
|
528
529
|
when 'relationships'
|
529
530
|
value.keys.each do |links_key|
|
530
531
|
unless formatted_allowed_fields.include?(links_key.to_sym)
|
531
|
-
|
532
|
-
|
532
|
+
if JSONAPI.configuration.raise_if_parameters_not_allowed
|
533
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(links_key)
|
534
|
+
else
|
535
|
+
params_not_allowed.push(links_key)
|
533
536
|
value.delete links_key
|
534
537
|
end
|
535
538
|
end
|
@@ -537,8 +540,10 @@ module JSONAPI
|
|
537
540
|
when 'attributes'
|
538
541
|
value.each do |attr_key, attr_value|
|
539
542
|
unless formatted_allowed_fields.include?(attr_key.to_sym)
|
540
|
-
|
541
|
-
|
543
|
+
if JSONAPI.configuration.raise_if_parameters_not_allowed
|
544
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(attr_key)
|
545
|
+
else
|
546
|
+
params_not_allowed.push(attr_key)
|
542
547
|
value.delete attr_key
|
543
548
|
end
|
544
549
|
end
|
@@ -546,27 +551,30 @@ module JSONAPI
|
|
546
551
|
when 'type'
|
547
552
|
when 'id'
|
548
553
|
unless formatted_allowed_fields.include?(:id)
|
549
|
-
|
550
|
-
|
554
|
+
if JSONAPI.configuration.raise_if_parameters_not_allowed
|
555
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(:id)
|
556
|
+
else
|
557
|
+
params_not_allowed.push(:id)
|
551
558
|
params.delete :id
|
552
559
|
end
|
553
560
|
end
|
554
561
|
else
|
555
|
-
|
562
|
+
if JSONAPI.configuration.raise_if_parameters_not_allowed
|
563
|
+
fail JSONAPI::Exceptions::ParameterNotAllowed.new(key)
|
564
|
+
else
|
565
|
+
params_not_allowed.push(key)
|
566
|
+
params.delete key
|
567
|
+
end
|
556
568
|
end
|
557
569
|
end
|
558
570
|
|
559
571
|
if params_not_allowed.length > 0
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
JSONAPI::Warning.new(code: JSONAPI::PARAM_NOT_ALLOWED,
|
565
|
-
title: 'Param not allowed',
|
566
|
-
detail: "#{key} is not allowed.")
|
567
|
-
end
|
568
|
-
self.warnings.concat(params_not_allowed_warnings)
|
572
|
+
params_not_allowed_warnings = params_not_allowed.map do |param|
|
573
|
+
JSONAPI::Warning.new(code: JSONAPI::PARAM_NOT_ALLOWED,
|
574
|
+
title: 'Param not allowed',
|
575
|
+
detail: "#{param} is not allowed.")
|
569
576
|
end
|
577
|
+
self.warnings.concat(params_not_allowed_warnings)
|
570
578
|
end
|
571
579
|
end
|
572
580
|
|
data/lib/jsonapi/resource.rb
CHANGED
@@ -453,7 +453,7 @@ module JSONAPI
|
|
453
453
|
|
454
454
|
def resource_for(type)
|
455
455
|
type = type.underscore
|
456
|
-
type_with_module = type.
|
456
|
+
type_with_module = type.start_with?(module_path) ? type : module_path + type
|
457
457
|
|
458
458
|
resource_name = _resource_name_from_type(type_with_module)
|
459
459
|
resource = resource_name.safe_constantize if resource_name
|
@@ -507,10 +507,12 @@ module JSONAPI
|
|
507
507
|
end
|
508
508
|
end
|
509
509
|
|
510
|
-
def attribute(
|
510
|
+
def attribute(attribute_name, options = {})
|
511
|
+
attr = attribute_name.to_sym
|
512
|
+
|
511
513
|
check_reserved_attribute_name(attr)
|
512
514
|
|
513
|
-
if (attr
|
515
|
+
if (attr == :id) && (options[:format].nil?)
|
514
516
|
ActiveSupport::Deprecation.warn('Id without format is no longer supported. Please remove ids from attributes, or specify a format.')
|
515
517
|
end
|
516
518
|
|
@@ -808,6 +810,9 @@ module JSONAPI
|
|
808
810
|
|
809
811
|
def verify_filters(filters, context = nil)
|
810
812
|
verified_filters = {}
|
813
|
+
|
814
|
+
return verified_filters if filters.nil?
|
815
|
+
|
811
816
|
filters.each do |filter, raw_value|
|
812
817
|
verified_filter = verify_filter(filter, raw_value, context)
|
813
818
|
verified_filters[verified_filter[0]] = verified_filter[1]
|
@@ -1038,7 +1043,8 @@ module JSONAPI
|
|
1038
1043
|
options = attrs.extract_options!
|
1039
1044
|
options[:parent_resource] = self
|
1040
1045
|
|
1041
|
-
attrs.each do |
|
1046
|
+
attrs.each do |name|
|
1047
|
+
relationship_name = name.to_sym
|
1042
1048
|
check_reserved_relationship_name(relationship_name)
|
1043
1049
|
check_duplicate_relationship_name(relationship_name)
|
1044
1050
|
|
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.9.
|
4
|
+
version: 0.9.1.beta1
|
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: 2017-
|
12
|
+
date: 2017-05-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -212,12 +212,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
212
212
|
version: '2.1'
|
213
213
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
214
214
|
requirements:
|
215
|
-
- - "
|
215
|
+
- - ">"
|
216
216
|
- !ruby/object:Gem::Version
|
217
|
-
version:
|
217
|
+
version: 1.3.1
|
218
218
|
requirements: []
|
219
219
|
rubyforge_project:
|
220
|
-
rubygems_version: 2.5.
|
220
|
+
rubygems_version: 2.5.2
|
221
221
|
signing_key:
|
222
222
|
specification_version: 4
|
223
223
|
summary: Easily support JSON API in Rails.
|