From ea6c187fca418a4c6bd4353508b0e42848d8f371 Mon Sep 17 00:00:00 2001 From: Claire Date: Fri, 22 Dec 2023 16:10:39 +0100 Subject: [PATCH] Fix media attachment order of remote posts (#28469) --- app/lib/activitypub/activity/create.rb | 5 ++++- app/models/status.rb | 4 +++- spec/lib/activitypub/activity/create_spec.rb | 10 ++++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb index 0520ac089d..8eff9fdf40 100644 --- a/app/lib/activitypub/activity/create.rb +++ b/app/lib/activitypub/activity/create.rb @@ -110,6 +110,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity def process_status_params @status_parser = ActivityPub::Parser::StatusParser.new(@json, followers_collection: @account.followers_url) + attachment_ids = process_attachments.take(4).map(&:id) + @params = { uri: @status_parser.uri, url: @status_parser.url || @status_parser.uri, @@ -125,7 +127,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity visibility: @status_parser.visibility, thread: replied_to_status, 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, } end diff --git a/app/models/status.rb b/app/models/status.rb index 6b1598e7b1..10583521c6 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -284,7 +284,9 @@ class Status < ApplicationRecord def ordered_media_attachments 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 map = media_attachments.index_by(&:id) ordered_media_attachment_ids.filter_map { |media_attachment_id| map[media_attachment_id] } diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb index 4960126035..a0340216ad 100644 --- a/spec/lib/activitypub/activity/create_spec.rb +++ b/spec/lib/activitypub/activity/create_spec.rb @@ -578,15 +578,21 @@ RSpec.describe ActivityPub::Activity::Create do mediaType: 'image/png', url: 'http://example.com/attachment.png', }, + { + type: 'Document', + mediaType: 'image/png', + url: 'http://example.com/emoji.png', + }, ], } end - it 'creates status' do + it 'creates status with correctly-ordered media attachments' do status = sender.statuses.first 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