format.json do
skip_session!
- render_cached_json(['activitypub', 'actor', @account.cache_key], content_type: 'application/activity+json') do
+ render_cached_json(['activitypub', 'actor', @account], content_type: 'application/activity+json') do
ActiveModelSerializers::SerializableResource.new(@account, serializer: ActivityPub::ActorSerializer, adapter: ActivityPub::Adapter)
end
end
CONTEXT_LIMIT = 4_096
def show
- cached = Rails.cache.read(@status.cache_key)
- @status = cached unless cached.nil?
+ @status = cache_collection([@status], Status).first
render json: @status, serializer: REST::StatusSerializer
end
return raw unless klass.respond_to?(:with_includes)
raw = raw.cache_ids.to_a if raw.is_a?(ActiveRecord::Relation)
- uncached_ids = []
- cached_keys_with_value = Rails.cache.read_multi(*raw.map(&:cache_key))
-
- raw.each do |item|
- uncached_ids << item.id unless cached_keys_with_value.key?(item.cache_key)
- end
+ cached_keys_with_value = Rails.cache.read_multi(*raw).transform_keys(&:id)
+ uncached_ids = raw.map(&:id) - cached_keys_with_value.keys
klass.reload_stale_associations!(cached_keys_with_value.values) if klass.respond_to?(:reload_stale_associations!)
uncached = klass.where(id: uncached_ids).with_includes.map { |item| [item.id, item] }.to_h
uncached.each_value do |item|
- Rails.cache.write(item.cache_key, item)
+ Rails.cache.write(item, item)
end
end
- raw.map { |item| cached_keys_with_value[item.cache_key] || uncached[item.id] }.compact
+ raw.map { |item| cached_keys_with_value[item.id] || uncached[item.id] }.compact
end
def respond_with_error(code)
def render_cached_json(cache_key, **options)
options[:expires_in] ||= 3.minutes
- cache_key = cache_key.join(':') if cache_key.is_a?(Enumerable)
cache_public = options.key?(:public) ? options.delete(:public) : true
content_type = options.delete(:content_type) || 'application/json'
format.json do
skip_session!
- render_cached_json(['activitypub', 'emoji', @emoji.cache_key], content_type: 'application/activity+json') do
+ render_cached_json(['activitypub', 'emoji', @emoji], content_type: 'application/activity+json') do
ActiveModelSerializers::SerializableResource.new(@emoji, serializer: ActivityPub::EmojiSerializer, adapter: ActivityPub::Adapter)
end
end
format.json do
skip_session! unless @stream_entry.hidden?
- render_cached_json(['activitypub', 'note', @status.cache_key], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do
+ render_cached_json(['activitypub', 'note', @status], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do
ActiveModelSerializers::SerializableResource.new(@status, serializer: ActivityPub::NoteSerializer, adapter: ActivityPub::Adapter)
end
end
def activity
skip_session!
- render_cached_json(['activitypub', 'activity', @status.cache_key], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do
+ render_cached_json(['activitypub', 'activity', @status], content_type: 'application/activity+json', public: !@stream_entry.hidden?) do
ActiveModelSerializers::SerializableResource.new(@status, serializer: ActivityPub::ActivitySerializer, adapter: ActivityPub::Adapter)
end
end
#
class Status < ApplicationRecord
- self.cache_versioning = false
-
include Paginable
include Streamable
include Cacheable