otwarchive-symphonyarchive/lib/works_owner.rb

53 lines
1.6 KiB
Ruby
Raw Permalink Normal View History

2026-03-11 22:22:11 +00:00
# Used to generate cache keys for any works index page
# Include in models that can "own" works, eg ...tags/TAGNAME/works or users/LOGIN/works
module WorksOwner
def self.included(base)
base.extend(ClassMethods)
end
module ClassMethods
# expire a bunch of keys without having to look up the objects in the database
def expire_ids(ids)
ids.each do |id|
klass = (self.superclass == Tag) ? 'tag' : self.to_s.underscore
REDIS_GENERAL.set("#{klass}_#{id}_windex", Time.now.to_i.to_s)
end
end
end
# Used in works_controller to determine whether to expire the cache for this object's works index page
# The timestamp should reflect the last update that would cause the list to need refreshing
# When both a collection and a tag are given, include both in the key and use the tag's timestamp
def works_index_cache_key(tag=nil)
key = "works_index_for_#{self.class.name.underscore}_#{self.id}_"
if tag.present?
key << "tag_#{tag.id}_#{tag.works_index_timestamp}"
else
key << "#{self.works_index_timestamp}"
end
key
end
# Set the timestamp if it doesn't yet exist
def works_index_timestamp
REDIS_GENERAL.get(redis_works_index_key) || update_works_index_timestamp!
end
# Should be called wherever works are updated
# Making the timestamp a stringy integer mostly for ease of testing
def update_works_index_timestamp!
t = Time.now.to_i.to_s
REDIS_GENERAL.set(redis_works_index_key, t)
return t
end
private
def redis_works_index_key
klass = self.is_a?(Tag) ? 'tag' : self.class.to_s.underscore
"#{klass}_#{self.id}_windex"
end
end