2020-11-13 16:29:00 +00:00

54 lines
1.7 KiB
Ruby

# frozen_string_literal: true
module JSONAPI
module Serializer
# Our serializer PORO functionality
module Base
def initialize(resource, opts = {})
@resource = resource
@options = opts.dup
@params = @options.delete(:params) || {}
@fieldsets = @options.delete(:fields) || {}
@includes = @options.delete(:include) || []
@include = @includes.map(&:to_s).map(&:strip).reject(&:empty?)
end
def serializable_hash
is_collection = ::JSONAPI::Serializer.collection?(
@resource, force: @options[:is_collection]
)
jsonapi = { data: nil }
jsonapi[:data] = [] if is_collection
jsonapi[:meta] = @options[:meta] if @options[:meta].is_a?(Hash)
jsonapi[:links] = @options[:links] if @options[:links].is_a?(Hash)
return jsonapi if @resource.nil? || (is_collection && @resource.empty?)
data = []
included = []
# Used to avoid including duplicate records...
included_oids = Set.new
Array(@resource).each do |record|
serializer_class = self.class unless is_collection
serializer_class ||= JSONAPI::Serializer.for_object(record)
fieldset = @fieldsets[serializer_class.record_type]
data << serializer_class.record_hash(record, fieldset, @params)
included += serializer_class.record_includes(
record, @includes, included_oids, @fieldsets, @params
)
end
jsonapi[:data] = data
jsonapi[:data] = data.first unless is_collection
jsonapi[:included] = included unless @includes.empty?
jsonapi
end
end
end
end