Accept the same payload in multiple inboxes and deliver (#9150)
This commit is contained in:
		@@ -10,7 +10,12 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 | 
				
			|||||||
    RedisLock.acquire(lock_options) do |lock|
 | 
					    RedisLock.acquire(lock_options) do |lock|
 | 
				
			||||||
      if lock.acquired?
 | 
					      if lock.acquired?
 | 
				
			||||||
        @status = find_existing_status
 | 
					        @status = find_existing_status
 | 
				
			||||||
        process_status if @status.nil?
 | 
					
 | 
				
			||||||
 | 
					        if @status.nil?
 | 
				
			||||||
 | 
					          process_status
 | 
				
			||||||
 | 
					        elsif @options[:delivered_to_account_id].present?
 | 
				
			||||||
 | 
					          postprocess_audience_and_deliver
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
        raise Mastodon::RaceConditionError
 | 
					        raise Mastodon::RaceConditionError
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
@@ -99,6 +104,19 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 | 
				
			|||||||
    @params[:visibility] = :limited
 | 
					    @params[:visibility] = :limited
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def postprocess_audience_and_deliver
 | 
				
			||||||
 | 
					    return if @status.mentions.find_by(account_id: @options[:delivered_to_account_id])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    delivered_to_account = Account.find(@options[:delivered_to_account_id])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @status.mentions.create(account: delivered_to_account, silent: true)
 | 
				
			||||||
 | 
					    @status.update(visibility: :limited) if @status.direct_visibility?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return unless delivered_to_account.following?(@account)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    FeedInsertWorker.perform_async(@status.id, delivered_to_account.id, :home)
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def attach_tags(status)
 | 
					  def attach_tags(status)
 | 
				
			||||||
    @tags.each do |tag|
 | 
					    @tags.each do |tag|
 | 
				
			||||||
      status.tags << tag
 | 
					      status.tags << tag
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -58,10 +58,8 @@ class FanOutOnWriteService < BaseService
 | 
				
			|||||||
  def deliver_to_mentioned_followers(status)
 | 
					  def deliver_to_mentioned_followers(status)
 | 
				
			||||||
    Rails.logger.debug "Delivering status #{status.id} to limited followers"
 | 
					    Rails.logger.debug "Delivering status #{status.id} to limited followers"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    status.mentions.includes(:account).each do |mention|
 | 
					    FeedInsertWorker.push_bulk(status.mentions.includes(:account).map(&:account).select { |mentioned_account| mentioned_account.local? && mentioned_account.following?(status.account) }) do |follower|
 | 
				
			||||||
      mentioned_account = mention.account
 | 
					      [status.id, follower.id, :home]
 | 
				
			||||||
      next if !mentioned_account.local? || !mentioned_account.following?(status.account) || FeedManager.instance.filter?(:home, status, mention.account_id)
 | 
					 | 
				
			||||||
      FeedManager.instance.push_to_home(mentioned_account, status)
 | 
					 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user