jsonapi-resources 0.10.0.beta2 → 0.10.0

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.
@@ -81,6 +81,7 @@ module JSONAPI
81
81
  end
82
82
 
83
83
  def setup_show_related_resource_action(params, resource_klass)
84
+ resolve_singleton_id(params, resource_klass)
84
85
  source_klass = Resource.resource_klass_for(params.require(:source))
85
86
  source_id = source_klass.verify_key(params.require(source_klass._as_parent_key), @context)
86
87
 
@@ -102,6 +103,7 @@ module JSONAPI
102
103
  end
103
104
 
104
105
  def setup_index_related_resources_action(params, resource_klass)
106
+ resolve_singleton_id(params, resource_klass)
105
107
  source_klass = Resource.resource_klass_for(params.require(:source))
106
108
  source_id = source_klass.verify_key(params.require(source_klass._as_parent_key), @context)
107
109
 
@@ -128,6 +130,7 @@ module JSONAPI
128
130
  end
129
131
 
130
132
  def setup_show_action(params, resource_klass)
133
+ resolve_singleton_id(params, resource_klass)
131
134
  fields = parse_fields(resource_klass, params[:fields])
132
135
  include_directives = parse_include_directives(resource_klass, params[:include])
133
136
  id = params[:id]
@@ -144,6 +147,7 @@ module JSONAPI
144
147
  end
145
148
 
146
149
  def setup_show_relationship_action(params, resource_klass)
150
+ resolve_singleton_id(params, resource_klass)
147
151
  relationship_type = params[:relationship]
148
152
  parent_key = params.require(resource_klass._as_parent_key)
149
153
  include_directives = parse_include_directives(resource_klass, params[:include])
@@ -191,6 +195,7 @@ module JSONAPI
191
195
  end
192
196
 
193
197
  def setup_create_relationship_action(params, resource_klass)
198
+ resolve_singleton_id(params, resource_klass)
194
199
  parse_modify_relationship_action(:add, params, resource_klass)
195
200
  end
196
201
 
@@ -199,6 +204,7 @@ module JSONAPI
199
204
  end
200
205
 
201
206
  def setup_update_action(params, resource_klass)
207
+ resolve_singleton_id(params, resource_klass)
202
208
  fields = parse_fields(resource_klass, params[:fields])
203
209
  include_directives = parse_include_directives(resource_klass, params[:include])
204
210
 
@@ -232,6 +238,7 @@ module JSONAPI
232
238
  end
233
239
 
234
240
  def setup_destroy_action(params, resource_klass)
241
+ resolve_singleton_id(params, resource_klass)
235
242
  JSONAPI::Operation.new(
236
243
  :remove_resource,
237
244
  resource_klass,
@@ -240,6 +247,7 @@ module JSONAPI
240
247
  end
241
248
 
242
249
  def setup_destroy_relationship_action(params, resource_klass)
250
+ resolve_singleton_id(params, resource_klass)
243
251
  parse_modify_relationship_action(:remove, params, resource_klass)
244
252
  end
245
253
 
@@ -556,20 +564,39 @@ module JSONAPI
556
564
 
557
565
  links_object = parse_to_many_links_object(linkage)
558
566
 
559
- # Since we do not yet support polymorphic to_many relationships we will raise an error if the type does not match the
560
- # relationship's type.
561
- # ToDo: Support Polymorphic relationships
562
-
563
567
  if links_object.length == 0
564
568
  add_result.call([])
565
569
  else
566
- if links_object.length > 1 || !links_object.has_key?(unformat_key(relationship.type).to_s)
567
- fail JSONAPI::Exceptions::TypeMismatch.new(links_object[:type], error_object_overrides)
568
- end
570
+ if relationship.polymorphic?
571
+ polymorphic_results = []
572
+
573
+ links_object.each_pair do |type, keys|
574
+ type_name = unformat_key(type).to_s
575
+
576
+ relationship_resource_klass = resource_klass.resource_klass_for(relationship.class_name)
577
+ relationship_klass = relationship_resource_klass._model_class
569
578
 
570
- links_object.each_pair do |type, keys|
571
- relationship_resource = Resource.resource_klass_for(resource_klass.module_path + unformat_key(type).to_s)
572
- add_result.call relationship_resource.verify_keys(keys, @context)
579
+ linkage_object_resource_klass = resource_klass.resource_klass_for(type_name)
580
+ linkage_object_klass = linkage_object_resource_klass._model_class
581
+
582
+ unless linkage_object_klass == relationship_klass || linkage_object_klass.in?(relationship_klass.subclasses)
583
+ fail JSONAPI::Exceptions::TypeMismatch.new(type_name)
584
+ end
585
+
586
+ relationship_ids = relationship_resource_klass.verify_keys(keys, @context)
587
+ polymorphic_results << { type: type, ids: relationship_ids }
588
+ end
589
+
590
+ add_result.call polymorphic_results
591
+ else
592
+ relationship_type = unformat_key(relationship.type).to_s
593
+
594
+ if links_object.length > 1 || !links_object.has_key?(relationship_type)
595
+ fail JSONAPI::Exceptions::TypeMismatch.new(links_object[:type])
596
+ end
597
+
598
+ relationship_resource_klass = Resource.resource_klass_for(resource_klass.module_path + relationship_type)
599
+ add_result.call relationship_resource_klass.verify_keys(links_object[relationship_type], @context)
573
600
  end
574
601
  end
575
602
  end
@@ -695,6 +722,13 @@ module JSONAPI
695
722
  end
696
723
  end
697
724
 
725
+ def resolve_singleton_id(params, resource_klass)
726
+ if resource_klass.singleton? && params[:id].nil?
727
+ key = resource_klass.singleton_key(context)
728
+ params[:id] = key
729
+ end
730
+ end
731
+
698
732
  def format_key(key)
699
733
  @key_formatter.format(key)
700
734
  end