def call(domain_block)
@domain_block = domain_block
- process_domain_block
+ process_domain_block!
end
private
- def process_domain_block
+ def process_domain_block!
clear_media! if domain_block.reject_media?
+
if domain_block.silence?
silence_accounts!
elsif domain_block.suspend?
end
end
+ def invalidate_association_caches!
+ # Normally, associated models of a status are immutable (except for accounts)
+ # so they are aggressively cached. After updating the media attachments to no
+ # longer point to a local file, we need to clear the cache to make those
+ # changes appear in the API and UI
+ @affected_status_ids.each { |id| Rails.cache.delete_matched("statuses/#{id}-*") }
+ end
+
def silence_accounts!
blocked_domain_accounts.in_batches.update_all(silenced: true)
end
def clear_media!
- clear_account_images
- clear_account_attachments
- clear_emojos
+ @affected_status_ids = []
+
+ clear_account_images!
+ clear_account_attachments!
+ clear_emojos!
+
+ invalidate_association_caches!
end
def suspend_accounts!
end
end
- def clear_account_images
+ def clear_account_images!
blocked_domain_accounts.find_each do |account|
- account.avatar.destroy
- account.header.destroy
+ account.avatar.destroy if account.avatar.exists?
+ account.header.destroy if account.header.exists?
account.save
end
end
- def clear_account_attachments
+ def clear_account_attachments!
media_from_blocked_domain.find_each do |attachment|
- attachment.file.destroy
+ @affected_status_ids << attachment.status_id if attachment.status_id.present?
+
+ attachment.file.destroy if attachment.file.exists?
attachment.type = :unknown
attachment.save
end
end
- def clear_emojos
+ def clear_emojos!
emojis_from_blocked_domains.destroy_all
end