class ContentfulMiddleman::Tools::PreviewProxy

Constants

CACHE_MAPPINGS

Public Class Methods

days(amount) click to toggle source
# File lib/contentful_middleman/tools/preview_proxy.rb, line 19
def self.days(amount)
  amount
end
hours(amount) click to toggle source
# File lib/contentful_middleman/tools/preview_proxy.rb, line 23
def self.hours(amount)
  amount / 24.0
end
instance(space: '', access_token: '', api_url: 'preview.contentful.com', tries: 3, expires_in: hours(2)) click to toggle source
# File lib/contentful_middleman/tools/preview_proxy.rb, line 7
def self.instance(space: '', access_token: '', api_url: 'preview.contentful.com', tries: 3, expires_in: hours(2))
  possible_instance = @@instances.detect { |i| i[:space] == space && i[:access_token] == access_token }
  if possible_instance.nil?
    preview_client = PreviewProxy.new(space: space, access_token: access_token, api_url: api_url, tries: tries, expires_in: expires_in)
    @@instances << {space: space, access_token: access_token, instance: preview_client}
  else
    preview_client = possible_instance[:instance]
  end

  preview_client
end
minutes(amount) click to toggle source
# File lib/contentful_middleman/tools/preview_proxy.rb, line 27
def self.minutes(amount)
  hours(amount) / 60.0
end
new(space: '', access_token: '', api_url: 'preview.contentful.com', tries: 3, expires_in: self.class.hours(2)) click to toggle source
Calls superclass method
# File lib/contentful_middleman/tools/preview_proxy.rb, line 50
def initialize(space: '', access_token: '', api_url: 'preview.contentful.com', tries: 3, expires_in: self.class.hours(2))
  super(
    space: space,
    access_token: access_token,
    dynamic_entries: :auto,
    preview: true,
    api_url: api_url
  )

  @cache_tries = tries
  @expires_in = expires_in

  clear_cache
end
seconds(amount) click to toggle source
# File lib/contentful_middleman/tools/preview_proxy.rb, line 31
def self.seconds(amount)
  minutes(amount) / 60.0
end

Public Instance Methods

asset(id, query = {}) click to toggle source
Calls superclass method
# File lib/contentful_middleman/tools/preview_proxy.rb, line 77
def asset(id, query = {})
  cache(:asset, ->(q, a_id) { super(a_id, q) }, query, id)
end
assets(query = {}) click to toggle source
Calls superclass method
# File lib/contentful_middleman/tools/preview_proxy.rb, line 73
def assets(query = {})
  cache(:assets, ->(q, _) { super(q) }, query)
end
clear_cache() click to toggle source
# File lib/contentful_middleman/tools/preview_proxy.rb, line 81
def clear_cache
  @cached_entry_collection = {}
  @cached_asset_collection = {}

  @cached_entries = {}
  @cached_assets = {}
end
entries(query = {}) click to toggle source
Calls superclass method
# File lib/contentful_middleman/tools/preview_proxy.rb, line 65
def entries(query = {})
  cache(:entries, ->(q, _) { super(q) }, query)
end
entry(id, query = {}) click to toggle source
Calls superclass method
# File lib/contentful_middleman/tools/preview_proxy.rb, line 69
def entry(id, query = {})
  cache(:entry, ->(q, e_id) { super(e_id, q) }, query, id)
end

Private Instance Methods

cache(name, super_call, query = {}, id = '') click to toggle source
# File lib/contentful_middleman/tools/preview_proxy.rb, line 91
def cache(name, super_call, query = {}, id = '')
  mapping = CACHE_MAPPINGS[name]
  query_copy = Marshal.load(Marshal.dump(query))

  if should_fetch_from_api?(name, query: query_copy, id: id)
    new_resources = super_call.call(query, id)
    instance_variable_get("@#{mapping[:cache]}")[cache_key(name, query_copy, id)] ||= {}
    instance_variable_get("@#{mapping[:cache]}")[cache_key(name, query_copy, id)][:tries] = 0
    instance_variable_get("@#{mapping[:cache]}")[cache_key(name, query_copy, id)][:expires] = DateTime.now + @expires_in
    instance_variable_get("@#{mapping[:cache]}")[cache_key(name, query_copy, id)][:data] = new_resources
    return new_resources
  end

  instance_variable_get("@#{mapping[:cache]}")[cache_key(name, query_copy, id)][:tries] += 1
  instance_variable_get("@#{mapping[:cache]}")[cache_key(name, query_copy, id)][:data]
end
cache_key(name, query = {}, id = '') click to toggle source
# File lib/contentful_middleman/tools/preview_proxy.rb, line 109
def cache_key(name, query = {}, id = '')
  Marshal.dump(collection?(name) ? query : query.merge(cache_id: id))
end
collection?(name) click to toggle source
# File lib/contentful_middleman/tools/preview_proxy.rb, line 113
def collection?(name)
  name.to_s.end_with?('s')
end
should_fetch_from_api?(name, query: {}, id: '') click to toggle source
# File lib/contentful_middleman/tools/preview_proxy.rb, line 117
def should_fetch_from_api?(name, query: {}, id: '')
  mapping = CACHE_MAPPINGS[name]

  cache = instance_variable_get("@#{mapping[:cache]}")
  key = cache_key(name, query, id)

  return true unless cache.key?(key)
  return true if cache[key][:tries] >= @cache_tries
  return true if cache[key][:expires] <= DateTime.now

  false
end