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|
 | 
			
		||||
      if lock.acquired?
 | 
			
		||||
        @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
 | 
			
		||||
        raise Mastodon::RaceConditionError
 | 
			
		||||
      end
 | 
			
		||||
@@ -99,6 +104,19 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 | 
			
		||||
    @params[:visibility] = :limited
 | 
			
		||||
  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)
 | 
			
		||||
    @tags.each do |tag|
 | 
			
		||||
      status.tags << tag
 | 
			
		||||
 
 | 
			
		||||
@@ -58,10 +58,8 @@ class FanOutOnWriteService < BaseService
 | 
			
		||||
  def deliver_to_mentioned_followers(status)
 | 
			
		||||
    Rails.logger.debug "Delivering status #{status.id} to limited followers"
 | 
			
		||||
 | 
			
		||||
    status.mentions.includes(:account).each do |mention|
 | 
			
		||||
      mentioned_account = mention.account
 | 
			
		||||
      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)
 | 
			
		||||
    FeedInsertWorker.push_bulk(status.mentions.includes(:account).map(&:account).select { |mentioned_account| mentioned_account.local? && mentioned_account.following?(status.account) }) do |follower|
 | 
			
		||||
      [status.id, follower.id, :home]
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user