create link class

This commit is contained in:
Kyle Reeves 2018-07-02 17:52:39 -05:00 committed by Shishir Kakaraddi
parent f86a8926f5
commit 699630d812
3 changed files with 41 additions and 10 deletions

29
lib/fast_jsonapi/link.rb Normal file
View File

@ -0,0 +1,29 @@
module FastJsonapi
class Link
attr_reader :key, :method, :conditional_proc
def initialize(key:, method:, options: {})
@key = key
@method = method
@conditional_proc = options[:if]
end
def serialize(record, serialization_params, output_hash)
if include_link?(record, serialization_params)
output_hash[key] = if method.is_a?(Proc)
method.arity == 1 ? method.call(record) : method.call(record, serialization_params)
else
record.public_send(method)
end
end
end
def include_link?(record, serialization_params)
if conditional_proc.present?
conditional_proc.call(record, serialization_params)
else
true
end
end
end
end

View File

@ -5,6 +5,7 @@ require 'active_support/concern'
require 'active_support/inflector' require 'active_support/inflector'
require 'fast_jsonapi/attribute' require 'fast_jsonapi/attribute'
require 'fast_jsonapi/relationship' require 'fast_jsonapi/relationship'
require 'fast_jsonapi/link'
require 'fast_jsonapi/serialization_core' require 'fast_jsonapi/serialization_core'
module FastJsonapi module FastJsonapi
@ -238,11 +239,16 @@ module FastJsonapi
{} {}
end end
def link(link_name, link_method_name = nil, &block) def link(link_name, link_method_name = nil, options = {}, &block)
self.data_links = {} if self.data_links.nil? self.data_links = {} if self.data_links.nil?
link_method_name = link_name if link_method_name.nil? link_method_name = link_name if link_method_name.nil?
key = run_key_transform(link_name) key = run_key_transform(link_name)
self.data_links[key] = block || link_method_name
self.data_links[key] = Link.new(
key: key,
method: block || link_method_name,
options: options
)
end end
def validate_includes!(includes) def validate_includes!(includes)

View File

@ -35,18 +35,14 @@ module FastJsonapi
end end
def links_hash(record, params = {}) def links_hash(record, params = {})
data_links.each_with_object({}) do |(key, method), link_hash| data_links.each_with_object({}) do |(_k, link), hash|
link_hash[key] = if method.is_a?(Proc) link.serialize(record, params, hash)
method.arity == 1 ? method.call(record) : method.call(record, params)
else
record.public_send(method)
end
end end
end end
def attributes_hash(record, params = {}) def attributes_hash(record, params = {})
attributes_to_serialize.each_with_object({}) do |(key, attribute), attr_hash| attributes_to_serialize.each_with_object({}) do |(_k, attribute), hash|
attribute.serialize(record, params, attr_hash) attribute.serialize(record, params, hash)
end end
end end