class AmsHal::Adapter

Public Instance Methods

serializable_hash(options = {}) click to toggle source
# File lib/ams_hal/adapter.rb, line 3
def serializable_hash(options = {})
  options = serialization_options(options)
  options[:fields] ||= instance_options[:fields]
  hash = if serializer.respond_to?(:each)
                 serialize_collection(serializer, instance_options, options)
               else
                 serialize_resource(serializer, instance_options, options)
               end

  self.class.transform_key_casing!(hash, instance_options)
end

Protected Instance Methods

serialize_associations(serializer, adapter_options) click to toggle source
# File lib/ams_hal/adapter.rb, line 107
def serialize_associations(serializer, adapter_options)
  serializer.associations.each_with_object({}) do |association, embedded|
    embedded[association.name] =
      if association.serializer.nil? || association.serializer.object.nil?
        # active_model_serializers <= 0.10.4
        object = serializer.object
        resource = object.public_send(association.name)
        serialized = [resource].flatten.map do |resrc|
          serialize_embedded_resource(resrc, serializer: association.serializer&.class)
        end
        serialized.size == 1 ? serialized.first : serialized
      elsif association.serializer.respond_to? :each
        association.serializer.map do |_serializer|
          serialize_resource(_serializer, instance_options, {skip_embedded: true})
        end
      else
        serialize_resource(association.serializer, instance_options, {skip_embedded: true})
      end
  end
end
serialize_collection(serializer, adapter_options, options) click to toggle source
# File lib/ams_hal/adapter.rb, line 40
def serialize_collection(serializer, adapter_options, options)
  options[:include_directive] = {} # Don't include associations as attributes
  hash = {}

  if links = serialize_links(serializer)
    hash[:_links] = links if links.any?
  end

  embedded = serializer.map do |_serializer|
    options[:skip_embedded] = true
    serialize_resource(_serializer, instance_options, options)
  end
  hash[:_embedded] = embedded if embedded.any?

  hash
end
serialize_curies(serializer) click to toggle source
# File lib/ams_hal/adapter.rb, line 77
def serialize_curies(serializer)
  return unless serializer.respond_to? :curies
  serializer.curies.each_with_object([]) do |(name, value), array|
    href = Link.new(serializer, value).value
    array << {
      name: name,
      href: href,
      templated: true
    }
  end
end
serialize_embedded(serializer) click to toggle source
# File lib/ams_hal/adapter.rb, line 89
def serialize_embedded(serializer)
  return unless serializer.respond_to? :embedded
  serializer.embedded.each_with_object({}) do |embed, embedded|
    resource = embed.resource_for(serializer)

    next unless resource

    serialized_resources = [resource].flatten.map do |resrc|
      serialize_embedded_resource(resrc)
    end
    embedded[embed.name] = if serialized_resources.size == 1
                              serialized_resources.first
                            else
                              serialized_resources
                            end
  end
end
serialize_resource(serializer, adapter_options, options) click to toggle source
# File lib/ams_hal/adapter.rb, line 17
def serialize_resource(serializer, adapter_options, options)
  skip_embedded = options.delete(:skip_embedded) || false

  options[:include_directive] = {} # Don't include associations as attributes
  hash = serializer.serializable_hash(adapter_options, options, self)

  if links = serialize_links(serializer)
    hash[:_links] = links if links.any?
  end

  return hash if skip_embedded

  if embedded = serialize_embedded(serializer)
    hash[:_embedded] = embedded if embedded.any?
  end

  if associations = serialize_associations(serializer, adapter_options)
    hash[:_embedded] = associations if associations.any?
  end

  hash
end

Private Instance Methods

serialize_embedded_resource(resource, serializer: nil) click to toggle source
# File lib/ams_hal/adapter.rb, line 130
def serialize_embedded_resource(resource, serializer: nil)
  serializable_resource = ActiveModelSerializers::SerializableResource.new(
    resource,
    serializer: serializer,
    adapter: AmsHal::Adapter
  )
  serializable_resource.as_json
end