lib/jsonapionify/api/relationship/many.rb in jsonapionify-0.11.11 vs lib/jsonapionify/api/relationship/many.rb in jsonapionify-0.12.0
- old
+ new
@@ -1,8 +1,24 @@
module JSONAPIonify::Api
class Relationship::Many < Relationship
+ using JSONAPIonify::DestructuredProc
+ DEFAULT_REPLACE_COMMIT = proc { |scope:, request_instances:|
+ to_add = request_instances - scope
+ to_delete = scope - request_instances
+ to_delete.each { |instance| scope.delete(instance) }
+ scope.concat to_add
+ }
+
+ DEFAULT_ADD_COMMIT = proc { |scope:, request_instances:|
+ scope.concat request_instances
+ }
+
+ DEFAULT_REMOVE_COMMIT = proc { |scope:, request_instances:|
+ request_instances.each { |instance| scope.delete(instance) }
+ }
+
prepend_class do
rel = self.rel
remove_action :read
class << self
undef_method :read
@@ -13,60 +29,76 @@
content_type: content_type,
callbacks: callbacks,
cacheable: true,
prepend: 'relationships'
}
- define_action(:show, 'GET', **options, &block).response status: 200 do |context|
- context.response_object[:data] = build_resource_identifier_collection(collection: context.collection)
- context.response_object.to_json
+ define_action(:show, 'GET', **options, &block).response status: 200 do |collection:, response_object:|
+ response_object[:data] = build_resource_identifier_collection(collection: collection)
+ response_object.to_json
end
end
define_singleton_method(:replace) do |content_type: nil, callbacks: true, &block|
+ block ||= DEFAULT_REPLACE_COMMIT
options = {
content_type: content_type,
callbacks: callbacks,
cacheable: false,
prepend: 'relationships',
example_input: :resource_identifier
}
- define_action(:replace, 'PATCH', **options, &block).response status: 200 do |context|
- context.response_object[:data] = build_resource_identifier_collection(collection: context.collection)
- context.response_object.to_json
+ define_action(:replace, 'PATCH', **options, &block).response status: 200 do |collection:, response_object:|
+ response_object[:data] = build_resource_identifier_collection(collection: collection)
+ response_object.to_json
end
end
define_singleton_method(:add) do |content_type: nil, callbacks: true, &block|
+ block ||= DEFAULT_ADD_COMMIT
options = {
content_type: content_type,
callbacks: callbacks,
cacheable: false,
prepend: 'relationships',
example_input: :resource_identifier
}
- define_action(:add, 'POST', **options, &block).response status: 200 do |context|
- context.response_object[:data] = build_resource_identifier_collection(collection: context.collection)
- context.response_object.to_json
+ define_action(:add, 'POST', **options, &block).response status: 200 do |collection:, response_object:|
+ response_object[:data] = build_resource_identifier_collection(collection: collection)
+ response_object.to_json
end
end
define_singleton_method(:remove) do |content_type: nil, callbacks: true, &block|
+ block ||= DEFAULT_REMOVE_COMMIT
options = {
content_type: content_type,
callbacks: callbacks,
cacheable: false,
prepend: 'relationships',
example_input: :resource_identifier
}
options[:prepend] = 'relationships'
- define_action(:remove, 'DELETE', **options, &block).response status: 200 do |context|
- context.response_object[:data] = build_resource_identifier_collection(collection: context.collection)
- context.response_object.to_json
+ define_action(:remove, 'DELETE', **options, &block).response status: 200 do |collection:, response_object:|
+ response_object[:data] = build_resource_identifier_collection(collection: collection)
+ response_object.to_json
end
end
- context :scope do |context|
- instance_exec(rel.name, context.owner, context, &rel.resolve)
+ context :scope do |context, owner:|
+ instance_exec(rel.name, owner, context, &rel.resolve.destructure)
+ end
+
+ after :commit_add, :commit_remove, :commit_replace do |owner:|
+ if defined?(ActiveRecord) && owner.is_a?(ActiveRecord::Base)
+ # Collect Errors
+ if owner.errors.present?
+ owner.errors.messages.each do |attr, messages|
+ messages.each do |message|
+ error :invalid_attribute, attr, message
+ end
+ end
+ end
+ end
end
show
end
end