class Consyncful::ItemMapper

Responsible for mapping an update received from Contentful's syncronisation API into useful fields for Consyncful::PersistedItem to store in the database.

Public Class Methods

new(item) click to toggle source
# File lib/consyncful/item_mapper.rb, line 8
def initialize(item)
  @item = item
end

Public Instance Methods

deletion?() click to toggle source
# File lib/consyncful/item_mapper.rb, line 12
def deletion?
  @item.is_a?(Contentful::DeletedEntry) || @item.is_a?(Contentful::DeletedAsset)
end
id() click to toggle source
# File lib/consyncful/item_mapper.rb, line 23
def id
  @item.id
end
mapped_fields(default_locale) click to toggle source
# File lib/consyncful/item_mapper.rb, line 27
def mapped_fields(default_locale)
  fields = generic_fields

  fields.merge!(localized_fields(default_locale))
  fields.merge!(localized_asset_fields(default_locale)) if type == 'asset'

  fields
end
type() click to toggle source
# File lib/consyncful/item_mapper.rb, line 16
def type
  case @item.type
  when 'Entry' then @item.content_type.id
  when 'Asset' then 'asset'
  end
end

Private Instance Methods

generic_fields() click to toggle source
# File lib/consyncful/item_mapper.rb, line 38
def generic_fields
  { created_at: @item.created_at,
    updated_at: @item.updated_at,
    revision: @item.revision,
    contentful_type: type,
    synced_at: Time.current }
end
localized_asset_fields(default_locale) click to toggle source
# File lib/consyncful/item_mapper.rb, line 62
def localized_asset_fields(default_locale)
  fields = {}
  files_by_locale = @item.raw.dig('fields', 'file') || {}

  files_by_locale.each do |locale_code, details|
    field_name = localized_field_name('file', locale_code, default_locale)
    fields[field_name.to_sym] = details
  end

  fields
end
localized_field_name(field, locale_code, default_locale) click to toggle source

Suffixes the field with the locale unless it's the default locale.

# File lib/consyncful/item_mapper.rb, line 75
def localized_field_name(field, locale_code, default_locale)
  return field if locale_code.to_s == default_locale.to_s

  "#{field}_#{locale_code.to_s.underscore}".to_sym
end
localized_fields(default_locale) click to toggle source
# File lib/consyncful/item_mapper.rb, line 46
def localized_fields(default_locale)
  fields = {}

  @item.fields_with_locales.each do |field, value_with_locales|
    value_with_locales.each do |locale_code, value|
      next if value.is_a? Contentful::File # assets are handeled below

      field_name = localized_field_name(field, locale_code, default_locale)
      field_name, value = mapped_field_entry_for(field_name, value)
      fields[field_name] = value
    end
  end

  fields
end
many_reference?(value) click to toggle source
# File lib/consyncful/item_mapper.rb, line 89
def many_reference?(value)
  value.is_a?(Array) && single_reference?(value.first)
end
mapped_field_entry_for(field, value) click to toggle source
# File lib/consyncful/item_mapper.rb, line 93
def mapped_field_entry_for(field, value)
  if single_reference?(value)
    [ActiveSupport::Inflector.foreign_key(field).to_sym, value.id]
  elsif many_reference?(value)
    ids_field_name = field.to_s.singularize + '_ids' # fk field name
    [ids_field_name.to_sym, value.map(&:id)]
  else
    [field, value]
  end
end
reference_value?(value) click to toggle source
# File lib/consyncful/item_mapper.rb, line 81
def reference_value?(value)
  single_reference?(value) || many_reference?(value)
end
single_reference?(value) click to toggle source
# File lib/consyncful/item_mapper.rb, line 85
def single_reference?(value)
  value.is_a?(Contentful::BaseResource)
end