Sha256: 7d768d719b15f0bc4319aedba80ae448c84fe7e449a7d8272473e6e4c81aca56

Contents?: true

Size: 1.44 KB

Versions: 1

Compression:

Stored size: 1.44 KB

Contents

require "thermos/beverage"
require "thermos/dependency"
require "thermos/notifier"
require "thermos/refill_job"

module Thermos

  def self.keep_warm(key:, model:, id:, deps: [], lookup_key: nil, &block)
    fill(key: key, model: model, deps: deps, lookup_key: lookup_key, &block)
    drink(key: key, id: id)
  end

  def self.fill(key:, model:, deps: [], lookup_key: nil, &block)
    @thermos ||= {}
    @thermos[key] = Beverage.new(key: key, model: model, deps: deps, action: block, lookup_key: lookup_key)
  end

  def self.drink(key:, id:)
    Rails.cache.fetch([key, id]) do
      @thermos[key].action.call(id)
    end
  end

  def self.empty
    @thermos = {}
  end

  def self.refill_primary_caches(model)
    @thermos.values.each do |beverage|
      refill(beverage, model.send(beverage.lookup_key)) if beverage.model == model.class
    end
  end

  def self.refill_dependency_caches(model)
    @thermos.values.each do |beverage|
      deps = beverage.deps.select { |dependency| dependency.klass == model.class }
      deps.each do |dependency|
        beverage_models = beverage.model.joins(dependency.association).where(dependency.table => { id: model.id })
        beverage_models.find_each do |beverage_model|
          refill(beverage, beverage_model.send(beverage.lookup_key))
        end
      end
    end
  end

  def self.refill(beverage, id)
    @thermos[beverage.key] = beverage
    Rails.cache.write([beverage.key, id], beverage.action.call(id))
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
thermos-0.0.4 lib/thermos.rb