class ContentfulRedis::ModelBase

Attributes

id[RW]

Public Class Methods

content_model() click to toggle source
# File lib/contentful_redis/model_base.rb, line 50
def content_model
  model_name = name.demodulize

  "#{model_name[0].downcase}#{model_name[1..-1]}"
end
define_searchable_fields(*fields) click to toggle source
# File lib/contentful_redis/model_base.rb, line 60
def define_searchable_fields(*fields)
  instance_eval("def searchable_fields; #{fields}; end")
end
destroy(id, env = nil) click to toggle source
# File lib/contentful_redis/model_base.rb, line 42
def destroy(id, env = nil)
  find(id, env).destroy
end
find(id, env = nil) click to toggle source
# File lib/contentful_redis/model_base.rb, line 15
def find(id, env = nil)
  raise ContentfulRedis::Error::ArgumentError, 'Expected Contentful model ID' unless id.is_a?(String)

  parameters = { 'sys.id': id, content_type: content_model }

  new(ContentfulRedis::Request.new(space, parameters, :get, request_env(env)).call)
end
find_by(args, env = ContentfulRedis.configuration.default_env || :published) click to toggle source
# File lib/contentful_redis/model_base.rb, line 23
def find_by(args, env = ContentfulRedis.configuration.default_env || :published)
  raise ContentfulRedis::Error::ArgumentError, "#{args} contain fields which are not a declared as a searchable field" unless (args.keys - searchable_fields).empty?

  id = args.values.map do |value|
    key = ContentfulRedis::KeyManager.attribute_index(self, value)
    key.nil? || key.empty? ? nil : ContentfulRedis.redis.get(key)
  end.compact.first

  raise ContentfulRedis::Error::RecordNotFound, 'Missing attribute in glossary' if id.nil?

  find(id, env)
end
new(model) click to toggle source
# File lib/contentful_redis/model_base.rb, line 71
def initialize(model)
  @id = model['items'].first.dig('sys', 'id')

  entries = entries_as_objects(model)

  model['items'].first['fields'].each do |key, value|
    value = case value
            when Array
              value.map { |val| entries[val.dig('sys', 'id')] }.compact
            when Hash
              extract_object_from_hash(model, value, entries)
            else
              value
            end

    instance_variable_set("@#{key.underscore}", value) unless value.nil?
  end

  create_searchable_attribute_links if self.class.searchable_fields.any?
end
searchable_fields() click to toggle source
# File lib/contentful_redis/model_base.rb, line 56
def searchable_fields
  []
end
space() click to toggle source
# File lib/contentful_redis/model_base.rb, line 46
def space
  ContentfulRedis.configuration.spaces.first[1]
end
update(id, env = nil) click to toggle source
# File lib/contentful_redis/model_base.rb, line 36
def update(id, env = nil)
  parameters = { 'sys.id': id, content_type: content_model }

  new(ContentfulRedis::Request.new(space, parameters, :update, request_env(env)).call)
end

Private Class Methods

request_env(env) click to toggle source
# File lib/contentful_redis/model_base.rb, line 66
def request_env(env)
  env || ContentfulRedis.configuration.default_env || :published
end

Public Instance Methods

content_type() click to toggle source
# File lib/contentful_redis/model_base.rb, line 110
def content_type
  self.class.name.demodulize.underscore
end
destroy() click to toggle source
# File lib/contentful_redis/model_base.rb, line 92
def destroy
  keys = [
    ContentfulRedis::KeyManager.content_model_key(
      self.class.space,
      endpoint,
      'sys.id': id,
      content_type: self.class.content_model,
      include: 1
    )
  ]

  self.class.send(:searchable_fields).each do |field|
    keys << ContentfulRedis::KeyManager.attribute_index(self.class, send(field.to_sym))
  end

  ContentfulRedis.redis.del(*keys)
end

Private Instance Methods

endpoint() click to toggle source
# File lib/contentful_redis/model_base.rb, line 116
def endpoint
  env = self.class.send(:request_env, nil)

  env.to_s.downcase == 'published' ? 'cdn' : 'preview'
end
entries_as_objects(model) click to toggle source
# File lib/contentful_redis/model_base.rb, line 122
def entries_as_objects(model)
  entries = model.dig('includes', 'Entry')

  return {} if entries.nil? || entries.empty?

  entries.each_with_object({}) do |entry, hash|
    type = entry.dig('sys', 'contentType', 'sys', 'id')
    id = entry.dig('sys', 'id')

    # Catch references to deleted or archived content.
    begin
      hash[id] = ContentfulRedis::ClassFinder.search(type).find(id)
    rescue ContentfulRedis::Error::RecordNotFound => _e
      next
    end
  end.compact
end
extract_object_from_hash(model, value, entries) click to toggle source
# File lib/contentful_redis/model_base.rb, line 140
def extract_object_from_hash(model, value, entries)
  entry_id = value.dig('sys', 'id')

  assets = model.dig('includes', 'Asset')
  asset = assets.first if !assets.nil? && assets.is_a?(Array)

  if entries.key?(entry_id)
    entries[entry_id]
  elsif !asset.nil?
    ContentfulRedis::Asset.new(asset)
  end
end