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.
- checksums.yaml +5 -5
- data/lib/jsonapi/{active_relation_resource_finder → active_relation}/adapters/join_left_active_record_adapter.rb +2 -2
- data/lib/jsonapi/active_relation/join_manager.rb +297 -0
- data/lib/jsonapi/{active_relation_resource_finder.rb → active_relation_resource.rb} +189 -146
- data/lib/jsonapi/acts_as_resource_controller.rb +4 -3
- data/lib/jsonapi/basic_resource.rb +1162 -0
- data/lib/jsonapi/cached_response_fragment.rb +66 -49
- data/lib/jsonapi/configuration.rb +18 -13
- data/lib/jsonapi/include_directives.rb +6 -8
- data/lib/jsonapi/link_builder.rb +71 -85
- data/lib/jsonapi/operation_result.rb +2 -2
- data/lib/jsonapi/path.rb +8 -0
- data/lib/jsonapi/path_segment.rb +17 -5
- data/lib/jsonapi/processor.rb +6 -7
- data/lib/jsonapi/relationship.rb +32 -3
- data/lib/jsonapi/request_parser.rb +44 -10
- data/lib/jsonapi/resource.rb +3 -1106
- data/lib/jsonapi/resource_controller_metal.rb +3 -0
- data/lib/jsonapi/resource_serializer.rb +39 -33
- data/lib/jsonapi/resource_set.rb +118 -48
- data/lib/jsonapi/resources/railtie.rb +9 -0
- data/lib/jsonapi/resources/version.rb +1 -1
- data/lib/jsonapi/response_document.rb +7 -2
- data/lib/jsonapi/routing_ext.rb +24 -4
- data/lib/jsonapi-resources.rb +12 -3
- data/lib/tasks/check_upgrade.rake +52 -0
- metadata +28 -12
- data/lib/jsonapi/active_relation_resource_finder/join_tree.rb +0 -227
|
@@ -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
|
|
567
|
-
|
|
568
|
-
|
|
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
|
-
|
|
571
|
-
|
|
572
|
-
|
|
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
|