- # frozen_string_literal: true
-
- class AfterBlockDomainFromAccountService < BaseService
- include Payloadable
-
- # This service does not create an AccountDomainBlock record,
- # it's meant to be called after such a record has been created
- # synchronously, to "clean up"
- def call(account, domain)
- @account = account
- @domain = domain
-
- clear_notifications!
- remove_follows!
- reject_existing_followers!
- reject_pending_follow_requests!
- end
-
- private
-
- def remove_follows!
- @account.active_relationships.where(account: Account.where(domain: @domain)).includes(:target_account).reorder(nil).find_each do |follow|
- UnfollowService.new.call(@account, follow.target_account)
- end
- end
-
- def clear_notifications!
- Notification.where(account: @account).where(from_account: Account.where(domain: @domain)).in_batches.delete_all
- end
-
- def reject_existing_followers!
- @account.passive_relationships.where(account: Account.where(domain: @domain)).includes(:account).reorder(nil).find_each do |follow|
- reject_follow!(follow)
- end
- end
-
- def reject_pending_follow_requests!
- FollowRequest.where(target_account: @account).where(account: Account.where(domain: @domain)).includes(:account).reorder(nil).find_each do |follow_request|
- reject_follow!(follow_request)
- end
- end
-
- def reject_follow!(follow)
- follow.destroy
-
- return unless follow.account.activitypub?
-
- ActivityPub::DeliveryWorker.perform_async(Oj.dump(serialize_payload(follow, ActivityPub::RejectFollowSerializer)), @account.id, follow.account.inbox_url)
- end
- end
|