Fix issues with processing toot edits (#17748)

* Fix searching for an already-known status by URL not working

* Fix Update processing from statuses prior to 20220302232632

`ordered_media_attachment_ids_changed?` would return `true` when going from
`nil` to anything (including `[]`).

* Add tests
th-downstream
Claire 3 years ago committed by GitHub
parent ada82e48ef
commit 2b2626619c

@ -13,7 +13,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
@poll_changed = false @poll_changed = false
# Only native types can be updated at the moment # Only native types can be updated at the moment
return if !expected_type? || already_updated_more_recently? return @status if !expected_type? || already_updated_more_recently?
last_edit_date = status.edited_at.presence || status.created_at last_edit_date = status.edited_at.presence || status.created_at
@ -41,13 +41,16 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
end end
forward_activity! if significant_changes? && @status_parser.edited_at.present? && @status_parser.edited_at > last_edit_date forward_activity! if significant_changes? && @status_parser.edited_at.present? && @status_parser.edited_at > last_edit_date
@status
end end
private private
def update_media_attachments! def update_media_attachments!
previous_media_attachments = @status.media_attachments.to_a previous_media_attachments = @status.media_attachments.to_a
next_media_attachments = [] previous_media_attachments_ids = @status.ordered_media_attachment_ids || previous_media_attachments.map(&:id)
next_media_attachments = []
as_array(@json['attachment']).each do |attachment| as_array(@json['attachment']).each do |attachment|
media_attachment_parser = ActivityPub::Parser::MediaAttachmentParser.new(attachment) media_attachment_parser = ActivityPub::Parser::MediaAttachmentParser.new(attachment)
@ -87,7 +90,7 @@ class ActivityPub::ProcessStatusUpdateService < BaseService
@status.ordered_media_attachment_ids = next_media_attachments.map(&:id) @status.ordered_media_attachment_ids = next_media_attachments.map(&:id)
@status.media_attachments.reload @status.media_attachments.reload
@media_attachments_changed = true if @status.ordered_media_attachment_ids_changed? @media_attachments_changed = true if @status.ordered_media_attachment_ids != previous_media_attachments_ids
end end
def update_poll! def update_poll!

@ -46,6 +46,26 @@ RSpec.describe ActivityPub::ProcessStatusUpdateService, type: :service do
expect(status.reload.spoiler_text).to eq 'Show more' expect(status.reload.spoiler_text).to eq 'Show more'
end end
context 'with no changes and originally with no ordered_media_attachment_ids' do
let(:payload) do
{
'@context': 'https://www.w3.org/ns/activitystreams',
id: 'foo',
type: 'Note',
content: 'Hello world',
}
end
before do
status.update(ordered_media_attachment_ids: nil)
subject.call(status, json)
end
it 'does not record an update' do
expect(status.reload.edited?).to be false
end
end
context 'originally without tags' do context 'originally without tags' do
before do before do
subject.call(status, json) subject.call(status, json)

Loading…
Cancel
Save