# frozen_string_literal: true class ActivityPub::DistributionWorker include Sidekiq::Worker include Payloadable sidekiq_options queue: 'push' def perform(status_id) @status = Status.find(status_id) @account = @status.account return if skip_distribution? ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url| [payload, @account.id, inbox_url, { synchronize_followers: !@status.distributable? }] end relay! if relayable? rescue ActiveRecord::RecordNotFound true end private def skip_distribution? @status.direct_visibility? || @status.limited_visibility? end def relayable? @status.public_visibility? end def inboxes # Deliver the status to all followers. # If the status is a reply to another local status, also forward it to that # status' authors' followers. @inboxes ||= if @status.in_reply_to_local_account? && @status.distributable? @account.followers.or(@status.thread.account.followers).inboxes else @account.followers.inboxes end end def payload @payload ||= Oj.dump(serialize_payload(ActivityPub::ActivityPresenter.from_status(@status), ActivityPub::ActivitySerializer, signer: @account)) end def relay! ActivityPub::DeliveryWorker.push_bulk(Relay.enabled.pluck(:inbox_url)) do |inbox_url| [payload, @account.id, inbox_url] end end end