class Agave::Local::ItemsRepo

Attributes

collections_by_type[R]
entities_repo[R]
item_type_methods[R]

Public Class Methods

new(entities_repo) click to toggle source
# File lib/agave/local/items_repo.rb, line 11
def initialize(entities_repo)
  @entities_repo = entities_repo
  @collections_by_type = {}
  @items_by_id = {}
  @items_by_parent_id = {}
  @item_type_methods = {}

  build_cache!
end

Public Instance Methods

available_locales() click to toggle source
# File lib/agave/local/items_repo.rb, line 44
def available_locales
  site.locales.map(&:to_sym)
end
children_of(id) click to toggle source
# File lib/agave/local/items_repo.rb, line 25
def children_of(id)
  @items_by_parent_id.fetch(id.to_s, [])
end
collection_item_types() click to toggle source
# File lib/agave/local/items_repo.rb, line 56
def collection_item_types
  item_types.select do |item_type|
    !item_type.singleton
  end
end
find(id) click to toggle source
# File lib/agave/local/items_repo.rb, line 21
def find(id)
  @items_by_id[id.to_s]
end
item_types() click to toggle source
# File lib/agave/local/items_repo.rb, line 48
def item_types
  entities_repo.find_entities_of_type('item_type')
end
items_of_type(item_type) click to toggle source
# File lib/agave/local/items_repo.rb, line 62
def items_of_type(item_type)
  method = item_type_methods[item_type]

  if item_type.singleton
    Array(@collections_by_type[method])
  else
    @collections_by_type[method]
  end
end
respond_to_missing?(method, include_private = false) click to toggle source
Calls superclass method
# File lib/agave/local/items_repo.rb, line 29
def respond_to_missing?(method, include_private = false)
  if collections_by_type.key?(method)
    true
  else
    super
  end
end
single_instance_item_types() click to toggle source
# File lib/agave/local/items_repo.rb, line 52
def single_instance_item_types
  item_types.select(&:singleton)
end
site() click to toggle source
# File lib/agave/local/items_repo.rb, line 37
def site
  Site.new(
    entities_repo.find_entities_of_type('site').first,
    self
  )
end

Private Instance Methods

build_cache!() click to toggle source
# File lib/agave/local/items_repo.rb, line 74
def build_cache!
  build_item_type_methods!
  build_collections_by_type!
  build_singletons_by_type!
end
build_collections_by_type!() click to toggle source
# File lib/agave/local/items_repo.rb, line 107
def build_collections_by_type!
  item_types.each do |item_type|
    method = item_type_methods[item_type]
    @collections_by_type[method] = if item_type.singleton
                                     nil
                                   else
                                     ItemCollection.new
                                   end
  end

  item_entities.each do |item_entity|
    item = Item.new(item_entity, self)
    method = item_type_methods[item_entity.item_type]

    unless item_entity.item_type.singleton
      @collections_by_type[method].push item
    end

    @items_by_id[item.id] = item

    if item_entity.respond_to?(:parent_id) && item_entity.parent_id
      @items_by_parent_id[item_entity.parent_id] ||= []
      @items_by_parent_id[item_entity.parent_id] << item
    end
  end

  item_types.each do |item_type|
    method = item_type_methods[item_type]
    if !item_type.singleton && item_type.sortable
      @collections_by_type[method].sort_by!(&:position)
    elsif item_type.ordering_field
      @collections_by_type[method].sort_by! do |item|
        item.send(item_type.ordering_field.api_key)
      end
      if item_type.ordering_direction == 'desc'
        @collections_by_type[method].reverse!
      end
    end
  end
end
build_item_type_methods!() click to toggle source
# File lib/agave/local/items_repo.rb, line 80
def build_item_type_methods!
  @item_type_methods = {}

  singleton_keys = single_instance_item_types.map(&:api_key)
  collection_keys = collection_item_types.map(&:api_key)
                                         .map(&:pluralize)

  clashing_keys = singleton_keys & collection_keys

  item_types.each do |item_type|
    pluralized_api_key = item_type.api_key.pluralize

    method = if item_type.singleton
               item_type.api_key
             else
               pluralized_api_key
             end

    if clashing_keys.include?(pluralized_api_key)
      suffix = item_type.singleton ? 'instance' : 'collection'
      method = "#{method}_#{suffix}"
    end

    @item_type_methods[item_type] = method.to_sym
  end
end
build_singletons_by_type!() click to toggle source
# File lib/agave/local/items_repo.rb, line 148
def build_singletons_by_type!
  item_types.each do |item_type|
    method = item_type_methods[item_type]
    next unless item_type.singleton

    item = if item_type.singleton_item
             @items_by_id[item_type.singleton_item.id]
           end

    @collections_by_type[method] = item
  end
end
item_entities() click to toggle source
# File lib/agave/local/items_repo.rb, line 161
def item_entities
  entities_repo.find_entities_of_type('item')
end
method_missing(method, *arguments, &block) click to toggle source
Calls superclass method
# File lib/agave/local/items_repo.rb, line 165
def method_missing(method, *arguments, &block)
  if collections_by_type.key?(method) && arguments.empty?
    collections_by_type[method]
  else
    super
  end
rescue NoMethodError
  message = []
  message << "Undefined method `#{method}`"
  message << 'Available AgaveCMS collections/items:'
  message += collections_by_type.map do |key, _value|
    "* .#{key}"
  end
  raise NoMethodError, message.join("\n")
end