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