mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-28 21:07:16 +00:00
101 lines
2.4 KiB
Ruby
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
|