module DrySerialization::Concerns::Deserializable

Public Instance Methods

deserialized_payload(base_params, object = nil) click to toggle source
# File lib/dry_serialization/concerns/deserializable.rb, line 5
def deserialized_payload(base_params, object = nil)
  attrs = attributes(base_params)
  id = dig_id(base_params, object)
  attrs.merge!(id: id) if id
  
  build_nested_relationships(attrs, base_params)
end

Private Instance Methods

attributes(base_params) click to toggle source
# File lib/dry_serialization/concerns/deserializable.rb, line 61
def attributes(base_params)
  base_params.dig(:data, :attributes)
end
build_nested_relationships(attrs, base_params) click to toggle source
# File lib/dry_serialization/concerns/deserializable.rb, line 15
def build_nested_relationships(attrs, base_params)
  relations = relationships(base_params)
  attrs.merge!(transform_object_values(relations))
end
dig_id(base_params, object) click to toggle source
# File lib/dry_serialization/concerns/deserializable.rb, line 52
def dig_id(base_params, object)
  return unless object
  
  base_params.dig(:data, :id)
  send("#{object}_id")
rescue
  nil
end
relationships(base_params) click to toggle source
# File lib/dry_serialization/concerns/deserializable.rb, line 65
def relationships(base_params)
  base_params.dig(:data, :relationships)
end
transform_nested_relationships_to_get_attributes(parent_relation_hash, data) click to toggle source
# File lib/dry_serialization/concerns/deserializable.rb, line 28
def transform_nested_relationships_to_get_attributes(parent_relation_hash, data)
  nested_relationships = data[:data].respond_to?(:key?) ? relationships(data) : nil
  return unless nested_relationships
  
  nested_relationships.each do |(relation, rel_data)|
    hash = { "#{relation}_attributes": transform_relationships_to_get_attributes(rel_data) }
    parent_relation_hash.merge!(hash)
  end
end
transform_object_values(relations) click to toggle source
# File lib/dry_serialization/concerns/deserializable.rb, line 20
def transform_object_values(relations)
  relations.to_h.each_with_object({}) do |(key, data), acc|
    key = "#{key}_attributes" unless key.end_with?('_attributes')
    acc[key] ||= transform_relationships_to_get_attributes(data)
    transform_nested_relationships_to_get_attributes(acc[key], data)
  end
end
transform_relationships_to_get_attributes(object) click to toggle source
# File lib/dry_serialization/concerns/deserializable.rb, line 38
def transform_relationships_to_get_attributes(object)
  case object[:data]
    when Hash
      object[:attributes] || object.dig(:data, :attributes)
    when Array
      object[:data].map do |e|
        attrs = transform_relationships_to_get_attributes({ data: e })
        attrs.merge!(transform_object_values(e[:relationships]))
      end
    else
      return
  end
end