mirror of
https://github.com/lunaisnotaboy/mastodon.git
synced 2024-08-17 13:36:25 +00:00
Just don't try to save space by only selecting few attributes. If anyone is wondering, this is needed because the emoji entity cache is not really only used for entities, it's accessed again to generate Emoji tags in ActivityPub/OStatus, so a lot more properties are used than what is needed in HTML alone...
35 lines
1.2 KiB
Ruby
35 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'singleton'
|
|
|
|
class EntityCache
|
|
include Singleton
|
|
|
|
MAX_EXPIRATION = 7.days.freeze
|
|
|
|
def mention(username, domain)
|
|
Rails.cache.fetch(to_key(:mention, username, domain), expires_in: MAX_EXPIRATION) { Account.select(:username, :domain, :url).find_remote(username, domain) }
|
|
end
|
|
|
|
def emoji(shortcodes, domain)
|
|
shortcodes = [shortcodes] unless shortcodes.is_a?(Array)
|
|
cached = Rails.cache.read_multi(*shortcodes.map { |shortcode| to_key(:emoji, shortcode, domain) })
|
|
uncached_ids = []
|
|
|
|
shortcodes.each do |shortcode|
|
|
uncached_ids << shortcode unless cached.key?(to_key(:emoji, shortcode, domain))
|
|
end
|
|
|
|
unless uncached_ids.empty?
|
|
uncached = CustomEmoji.where(shortcode: shortcodes, domain: domain, disabled: false).map { |item| [item.shortcode, item] }.to_h
|
|
uncached.each_value { |item| Rails.cache.write(to_key(:emoji, item.shortcode, domain), item, expires_in: MAX_EXPIRATION) }
|
|
end
|
|
|
|
shortcodes.map { |shortcode| cached[to_key(:emoji, shortcode, domain)] || uncached[shortcode] }.compact
|
|
end
|
|
|
|
def to_key(type, *ids)
|
|
"#{type}:#{ids.compact.map(&:downcase).join(':')}"
|
|
end
|
|
end
|