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...
		
			
				
	
	
		
			34 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			34 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
 |