diff options
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/form/account_batch.rb | 60 | ||||
-rw-r--r-- | app/models/status.rb | 4 |
2 files changed, 63 insertions, 1 deletions
diff --git a/app/models/form/account_batch.rb b/app/models/form/account_batch.rb new file mode 100644 index 000000000..60eaaf0e2 --- /dev/null +++ b/app/models/form/account_batch.rb @@ -0,0 +1,60 @@ +# frozen_string_literal: true + +class Form::AccountBatch + include ActiveModel::Model + + attr_accessor :account_ids, :action, :current_account + + def save + case action + when 'unfollow' + unfollow! + when 'remove_from_followers' + remove_from_followers! + when 'block_domains' + block_domains! + end + end + + private + + def unfollow! + accounts.find_each do |target_account| + UnfollowService.new.call(current_account, target_account) + end + end + + def remove_from_followers! + current_account.passive_relationships.where(account_id: account_ids).find_each do |follow| + reject_follow!(follow) + end + end + + def block_domains! + AfterAccountDomainBlockWorker.push_bulk(account_domains) do |domain| + [current_account.id, domain] + end + end + + def account_domains + accounts.pluck(Arel.sql('distinct domain')).compact + end + + def accounts + Account.where(id: account_ids) + end + + def reject_follow!(follow) + follow.destroy + + return unless follow.account.activitypub? + + json = ActiveModelSerializers::SerializableResource.new( + follow, + serializer: ActivityPub::RejectFollowSerializer, + adapter: ActivityPub::Adapter + ).to_json + + ActivityPub::DeliveryWorker.perform_async(json, current_account.id, follow.account.inbox_url) + end +end diff --git a/app/models/status.rb b/app/models/status.rb index f576489b4..440d7cc63 100644 --- a/app/models/status.rb +++ b/app/models/status.rb @@ -73,7 +73,9 @@ class Status < ApplicationRecord validates_with StatusLengthValidator validates_with DisallowedHashtagsValidator validates :reblog, uniqueness: { scope: :account }, if: :reblog? - validates_associated :owned_poll + validates :visibility, exclusion: { in: %w(direct limited) }, if: :reblog? + + accepts_nested_attributes_for :owned_poll default_scope { recent } |