d60fd87e01
There's no reason for an Account record to persist after Delete->Actor is received. SuspendAccountService is necessary to make sure deleted toots get sent over streaming API properly and home feeds get cleaned up. By removing Account record, we can ensure that if in the future the account is restored remotely (or username reused), it can start with a clean slate.
49 lines
1.2 KiB
Ruby
49 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class ActivityPub::Activity::Delete < ActivityPub::Activity
|
|
def perform
|
|
if @account.uri == object_uri
|
|
delete_person
|
|
else
|
|
delete_note
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def delete_person
|
|
SuspendAccountService.new.call(@account)
|
|
@account.destroy!
|
|
end
|
|
|
|
def delete_note
|
|
status = Status.find_by(uri: object_uri, account: @account)
|
|
status ||= Status.find_by(uri: @object['atomUri'], account: @account) if @object.is_a?(Hash) && @object['atomUri'].present?
|
|
|
|
delete_later!(object_uri)
|
|
|
|
return if status.nil?
|
|
|
|
forward_for_reblogs(status)
|
|
delete_now!(status)
|
|
end
|
|
|
|
def forward_for_reblogs(status)
|
|
return if @json['signature'].blank?
|
|
|
|
rebloggers_ids = status.reblogs.includes(:account).references(:account).merge(Account.local).pluck(:account_id)
|
|
inboxes = Account.where(id: ::Follow.where(target_account_id: rebloggers_ids).select(:account_id)).inboxes - [@account.preferred_inbox_url]
|
|
|
|
ActivityPub::DeliveryWorker.push_bulk(inboxes) do |inbox_url|
|
|
[payload, rebloggers_ids.first, inbox_url]
|
|
end
|
|
end
|
|
|
|
def delete_now!(status)
|
|
RemoveStatusService.new.call(status)
|
|
end
|
|
|
|
def payload
|
|
@payload ||= Oj.dump(@json)
|
|
end
|
|
end
|