Files
openfoodnetwork/app/models/spree/preferences/store.rb
2023-09-13 16:45:00 +09:00

101 lines
2.4 KiB
Ruby

# frozen_string_literal: true
# Use singleton class Spree::Preferences::Store.instance to access
#
# StoreInstance has a persistence flag that is on by default,
# but we disable database persistence in testing to speed up tests
#
require 'singleton'
module Spree
module Preferences
class StoreInstance
attr_accessor :persistence
def initialize
@cache = Rails.cache
@persistence = true
end
def set(key, value, type)
@cache.write(key, value)
persist(key, value, type)
end
def exist?(key)
@cache.exist?(key) ||
(should_persist? && Spree::Preference.where(key:).exists?)
end
def get(key, fallback = nil)
# return the retrieved value, if it's in the cache
# use unless nil? incase the value is actually boolean false
#
unless (val = @cache.read(key)).nil?
return val
end
# If it's not in the cache, maybe it's in the database, but has been cleared from the cache
# does it exist in the database?
if should_persist? && Spree::Preference.table_exists?
preference = Spree::Preference.find_by(key:)
if preference
# it does exist, so let's put it back into the cache
@cache.write(preference.key, preference.value)
# and return the value
return preference.value
end
end
unless fallback.nil?
# cache fallback so we won't hit the db above on
# subsequent queries for the same key
#
@cache.write(key, fallback)
end
fallback
end
def delete(key)
return if key.nil?
@cache.delete(key)
destroy(key)
end
def clear_cache
@cache.clear
end
private
def persist(cache_key, value, type)
return unless should_persist?
preference = Spree::Preference.where(key: cache_key).first_or_initialize
preference.value = value
preference.value_type = type
preference.save
end
def destroy(cache_key)
return unless should_persist?
preference = Spree::Preference.find_by(key: cache_key)
preference&.destroy
end
def should_persist?
@persistence && Spree::Preference.connected? && Spree::Preference.table_exists?
end
end
class Store < StoreInstance
include Singleton
end
end
end