module FmRest::Spyke::Model::Serialization

Public Instance Methods

to_params() click to toggle source

Spyke override – Return FM Data API's expected JSON format, including only modified fields.

# File lib/fmrest/spyke/model/serialization.rb, line 10
def to_params
  params = {
    fieldData: serialize_values!(changed_params_not_embedded_in_url).merge(serialize_portal_deletions)
  }

  params[:modId] = __mod_id.to_s if __mod_id

  portal_data = serialize_portals

  params[:portalData] = portal_data unless portal_data.empty?

  params
end

Protected Instance Methods

serialize_for_portal(portal) click to toggle source
# File lib/fmrest/spyke/model/serialization.rb, line 26
def serialize_for_portal(portal)
  params =
    changed_params.except(:__record_id).transform_keys do |key|
      "#{portal.attribute_prefix}::#{key}"
    end

  params[:recordId] = __record_id.to_s if __record_id
  params[:modId] = __mod_id.to_s if __mod_id

  serialize_values!(params)
end

Private Instance Methods

changed_params_not_embedded_in_url() click to toggle source
# File lib/fmrest/spyke/model/serialization.rb, line 69
def changed_params_not_embedded_in_url
  params_not_embedded_in_url.slice(*mapped_changed)
end
serialize_portal_deletions() click to toggle source
# File lib/fmrest/spyke/model/serialization.rb, line 54
def serialize_portal_deletions
  deletions = []

  portals.each do |portal|
    portal.select(&:marked_for_destruction?).each do |portal_record|
      next unless portal_record.persisted?
      deletions << "#{portal.portal_key}.#{portal_record.__record_id}"
    end
  end

  return {} if deletions.length == 0

  { deleteRelated: deletions.length == 1 ? deletions.first : deletions }
end
serialize_portals() click to toggle source
# File lib/fmrest/spyke/model/serialization.rb, line 40
def serialize_portals
  portal_data = {}

  portals.each do |portal|
    portal.each do |portal_record|
      next unless portal_record.changed? && !portal_record.marked_for_destruction?
      portal_params = portal_data[portal.portal_key] ||= []
      portal_params << portal_record.serialize_for_portal(portal)
    end
  end

  portal_data
end
serialize_values!(params) click to toggle source

Modifies the given hash in-place encoding non-string values (e.g. dates) to their string representation when appropriate.

nil gets converted to empty string as the Data API doesn't accept nulls in JSON. Likewise, true and false get converted to 1 and 0 respectively.

# File lib/fmrest/spyke/model/serialization.rb, line 80
def serialize_values!(params)
  params.transform_values! do |value|
    case value
    when *FmRest::V1.datetime_classes
      FmRest::V1.convert_datetime_timezone(value.to_datetime, fmrest_config.timezone).strftime(FmRest::V1::Dates::FM_DATETIME_FORMAT)
    when *FmRest::V1.date_classes
      value.strftime(FmRest::V1::Dates::FM_DATE_FORMAT)
    when nil
      ""
    when true, false
      value ? 1 : 0
    else
      value
    end
  end

  params
end