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
create_searchable_attribute_links()
click to toggle source
# File lib/contentful_redis/model_base.rb, line 153 def create_searchable_attribute_links self.class.searchable_fields.each do |field| begin instance_attribute = send(field) rescue NoMethodError => _e raise ContentfulRedis::Error::ArgumentError, "Undefined attribute: #{field} when creating attribute glossary" end raise ContentfulRedis::Error::ArgumentError, 'Searchable fields cannot be blank and must be required' if instance_attribute.nil? raise ContentfulRedis::Error::ArgumentError, 'Searchable fields must be singular and cannot be references' if instance_attribute.is_a?(Array) key = ContentfulRedis::KeyManager.attribute_index(self.class, send(field)) next if ContentfulRedis.redis.exists(key) ContentfulRedis.redis.set(key, id) end end
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