Fix media attachment order of remote posts (#28469)

This commit is contained in:
Claire 2023-12-22 16:10:39 +01:00
parent 72ff0d30d8
commit ea6c187fca
3 changed files with 15 additions and 4 deletions

View file

@ -110,6 +110,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
def process_status_params def process_status_params
@status_parser = ActivityPub::Parser::StatusParser.new(@json, followers_collection: @account.followers_url) @status_parser = ActivityPub::Parser::StatusParser.new(@json, followers_collection: @account.followers_url)
attachment_ids = process_attachments.take(4).map(&:id)
@params = { @params = {
uri: @status_parser.uri, uri: @status_parser.uri,
url: @status_parser.url || @status_parser.uri, url: @status_parser.url || @status_parser.uri,
@ -125,7 +127,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
visibility: @status_parser.visibility, visibility: @status_parser.visibility,
thread: replied_to_status, thread: replied_to_status,
conversation: conversation_from_uri(@object['conversation']), conversation: conversation_from_uri(@object['conversation']),
media_attachment_ids: process_attachments.take(4).map(&:id), media_attachment_ids: attachment_ids,
ordered_media_attachment_ids: attachment_ids,
poll: process_poll, poll: process_poll,
} }
end end

View file

@ -284,7 +284,9 @@ class Status < ApplicationRecord
def ordered_media_attachments def ordered_media_attachments
if ordered_media_attachment_ids.nil? if ordered_media_attachment_ids.nil?
media_attachments # NOTE: sort Ruby-side to avoid hitting the database when the status is
# not persisted to database yet
media_attachments.sort_by(&:id)
else else
map = media_attachments.index_by(&:id) map = media_attachments.index_by(&:id)
ordered_media_attachment_ids.filter_map { |media_attachment_id| map[media_attachment_id] } ordered_media_attachment_ids.filter_map { |media_attachment_id| map[media_attachment_id] }

View file

@ -578,15 +578,21 @@ RSpec.describe ActivityPub::Activity::Create do
mediaType: 'image/png', mediaType: 'image/png',
url: 'http://example.com/attachment.png', url: 'http://example.com/attachment.png',
}, },
{
type: 'Document',
mediaType: 'image/png',
url: 'http://example.com/emoji.png',
},
], ],
} }
end end
it 'creates status' do it 'creates status with correctly-ordered media attachments' do
status = sender.statuses.first status = sender.statuses.first
expect(status).to_not be_nil expect(status).to_not be_nil
expect(status.media_attachments.map(&:remote_url)).to include('http://example.com/attachment.png') expect(status.ordered_media_attachments.map(&:remote_url)).to eq ['http://example.com/attachment.png', 'http://example.com/emoji.png']
expect(status.ordered_media_attachment_ids).to be_present
end end
end end