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
This commit is contained in:
		
							parent
							
								
									d3aa9cf774
								
							
						
					
					
						commit
						92a86b958e
					
				
					 2 changed files with 27 additions and 4 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		
		Reference in a new issue