forked from treehouse/mastodon
Refactor StatusReachFinder to handle followers and relays as well (#16051)
parent
6d6000f61f
commit
ca3bc1b09f
|
@ -6,11 +6,22 @@ class StatusReachFinder
|
||||||
end
|
end
|
||||||
|
|
||||||
def inboxes
|
def inboxes
|
||||||
Account.where(id: reached_account_ids).inboxes
|
(reached_account_inboxes + followers_inboxes + relay_inboxes).uniq
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def reached_account_inboxes
|
||||||
|
# When the status is a reblog, there are no interactions with it
|
||||||
|
# directly, we assume all interactions are with the original one
|
||||||
|
|
||||||
|
if @status.reblog?
|
||||||
|
[]
|
||||||
|
else
|
||||||
|
Account.where(id: reached_account_ids).inboxes
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def reached_account_ids
|
def reached_account_ids
|
||||||
[
|
[
|
||||||
replied_to_account_id,
|
replied_to_account_id,
|
||||||
|
@ -49,4 +60,16 @@ class StatusReachFinder
|
||||||
def replies_account_ids
|
def replies_account_ids
|
||||||
@status.replies.pluck(:account_id)
|
@status.replies.pluck(:account_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def followers_inboxes
|
||||||
|
@status.account.followers.inboxes
|
||||||
|
end
|
||||||
|
|
||||||
|
def relay_inboxes
|
||||||
|
if @status.public_visibility?
|
||||||
|
Relay.enabled.pluck(:inbox_url)
|
||||||
|
else
|
||||||
|
[]
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -27,10 +27,7 @@ class RemoveStatusService < BaseService
|
||||||
# original object being removed implicitly removes reblogs
|
# original object being removed implicitly removes reblogs
|
||||||
# of it. The Delete activity of the original is forwarded
|
# of it. The Delete activity of the original is forwarded
|
||||||
# separately.
|
# separately.
|
||||||
if @account.local? && !@options[:original_removed]
|
remove_from_remote_reach if @account.local? && !@options[:original_removed]
|
||||||
remove_from_remote_followers
|
|
||||||
remove_from_remote_reach
|
|
||||||
end
|
|
||||||
|
|
||||||
# Since reblogs don't mention anyone, don't get reblogged,
|
# Since reblogs don't mention anyone, don't get reblogged,
|
||||||
# favourited and don't contain their own media attachments
|
# favourited and don't contain their own media attachments
|
||||||
|
@ -82,13 +79,10 @@ class RemoveStatusService < BaseService
|
||||||
end
|
end
|
||||||
|
|
||||||
def remove_from_remote_reach
|
def remove_from_remote_reach
|
||||||
return if @status.reblog?
|
# Followers, relays, people who got mentioned in the status,
|
||||||
|
# or who reblogged it from someone else might not follow
|
||||||
# People who got mentioned in the status, or who
|
# the author and wouldn't normally receive the delete
|
||||||
# reblogged it from someone else might not follow
|
# notification - so here, we explicitly send it to them
|
||||||
# the author and wouldn't normally receive the
|
|
||||||
# delete notification - so here, we explicitly
|
|
||||||
# send it to them
|
|
||||||
|
|
||||||
status_reach_finder = StatusReachFinder.new(@status)
|
status_reach_finder = StatusReachFinder.new(@status)
|
||||||
|
|
||||||
|
@ -97,24 +91,6 @@ class RemoveStatusService < BaseService
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def remove_from_remote_followers
|
|
||||||
ActivityPub::DeliveryWorker.push_bulk(@account.followers.inboxes) do |inbox_url|
|
|
||||||
[signed_activity_json, @account.id, inbox_url]
|
|
||||||
end
|
|
||||||
|
|
||||||
relay! if relayable?
|
|
||||||
end
|
|
||||||
|
|
||||||
def relayable?
|
|
||||||
@status.public_visibility?
|
|
||||||
end
|
|
||||||
|
|
||||||
def relay!
|
|
||||||
ActivityPub::DeliveryWorker.push_bulk(Relay.enabled.pluck(:inbox_url)) do |inbox_url|
|
|
||||||
[signed_activity_json, @account.id, inbox_url]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def signed_activity_json
|
def signed_activity_json
|
||||||
@signed_activity_json ||= Oj.dump(serialize_payload(@status, @status.reblog? ? ActivityPub::UndoAnnounceSerializer : ActivityPub::DeleteSerializer, signer: @account))
|
@signed_activity_json ||= Oj.dump(serialize_payload(@status, @status.reblog? ? ActivityPub::UndoAnnounceSerializer : ActivityPub::DeleteSerializer, signer: @account))
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue