Fix quote serializer (#34510)

This commit is contained in:
Claire 2025-04-23 09:29:13 +02:00 committed by GitHub
parent e097f0e9eb
commit dee744c793
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 34 additions and 8 deletions

View File

@ -7,14 +7,24 @@ class StatusRelationshipsPresenter
:bookmarks_map, :filters_map, :attributes_map
def initialize(statuses, current_account_id = nil, **options)
@current_account_id = current_account_id
# Keeping a reference to @statuses is ok since `StatusRelationshipsPresenter`
# basically never outlives the statuses collection it is passed
@statuses = statuses
if current_account_id.nil?
@reblogs_map = {}
@favourites_map = {}
@bookmarks_map = {}
@mutes_map = {}
@pins_map = {}
@filters_map = {}
@preloaded_account_relations = {}
@filters_map = {}
@reblogs_map = {}
@favourites_map = {}
@bookmarks_map = {}
@mutes_map = {}
@pins_map = {}
@attributes_map = {}
else
@preloaded_account_relations = nil
statuses = statuses.compact
status_ids = statuses.flat_map { |s| [s.id, s.reblog_of_id, s.proper.quote&.quoted_status_id] }.uniq.compact
conversation_ids = statuses.flat_map { |s| [s.proper.conversation_id, s.proper.quote&.quoted_status&.conversation_id] }.uniq.compact
@ -30,6 +40,17 @@ class StatusRelationshipsPresenter
end
end
# This one is currently on-demand as it is only used for quote posts
def preloaded_account_relations
@preloaded_account_relations ||= begin
accounts = @statuses.compact.flat_map { |s| [s.account, s.proper.account, s.proper.quote&.quoted_account] }.uniq.compact
account_ids = accounts.pluck(:id)
account_domains = accounts.pluck(:domain).uniq
Account.find(@current_account_id).relations_map(account_ids, account_domains)
end
end
private
def build_filters_map(statuses, current_account_id)

View File

@ -20,6 +20,6 @@ class REST::BaseQuoteSerializer < ActiveModel::Serializer
private
def status_filter
@status_filter ||= StatusFilter.new(object.quoted_status, current_user&.account, instance_options[:relationships] || {})
@status_filter ||= StatusFilter.new(object.quoted_status, current_user&.account, instance_options[:relationships]&.preloaded_account_relations || {})
end
end

View File

@ -26,8 +26,13 @@ RSpec.describe 'Home', :inline_jobs do
before do
user.account.follow!(bob)
user.account.follow!(ana)
PostStatusService.new.call(bob, text: 'New toot from bob.')
quoted = PostStatusService.new.call(bob, text: 'New toot from bob.')
PostStatusService.new.call(tim, text: 'New toot from tim.')
reblogged = PostStatusService.new.call(tim, text: 'New toot from tim, which will end up boosted.')
ReblogService.new.call(bob, reblogged)
# TODO: use PostStatusService argument when available rather than manually creating quote
quoting = PostStatusService.new.call(bob, text: 'Self-quote from bob.')
Quote.create!(status: quoting, quoted_status: quoted, state: :accepted)
PostStatusService.new.call(ana, text: 'New toot from ana.')
end