0
0
Fork 0

Change deletes to preserve soft-deleted statuses in unresolved reports (#11805)

Change all account actions except "none" to resolve all unresolved reports

Refactor `SuspendAccountService` to be more readable
This commit is contained in:
Eugen Rochko 2019-09-11 16:32:44 +02:00 committed by GitHub
parent 4fe127664b
commit c5d37f18cb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 98 additions and 45 deletions

View file

@ -115,6 +115,7 @@ class Account < ApplicationRecord
:approved?,
:pending?,
:disabled?,
:unconfirmed_or_pending?,
:role,
:admin?,
:moderator?,

View file

@ -83,19 +83,23 @@ class Admin::AccountAction
# A log entry is only interesting if the warning contains
# custom text from someone. Otherwise it's just noise.
log_action(:create, warning) if warning.text.present?
end
def process_reports!
return if report_id.blank?
# If we're doing "mark as resolved" on a single report,
# then we want to keep other reports open in case they
# contain new actionable information.
#
# Otherwise, we will mark all unresolved reports about
# the account as resolved.
authorize(report, :update?)
reports.each { |report| authorize(report, :update?) }
if type == 'none'
reports.each do |report|
log_action(:resolve, report)
report.resolve!(current_account)
else
Report.where(target_account: target_account).unresolved.update_all(action_taken: true, action_taken_by_account_id: current_account.id)
end
end
@ -141,6 +145,16 @@ class Admin::AccountAction
@report.status_ids if @report && include_statuses
end
def reports
@reports ||= begin
if type == 'none' && with_report?
[report]
else
Report.where(target_account: target_account).unresolved
end
end
end
def warning_preset
@warning_preset ||= AccountWarningPreset.find(warning_preset_id) if warning_preset_id.present?
end

View file

@ -69,6 +69,6 @@ class Form::AccountBatch
records = accounts.includes(:user)
records.each { |account| authorize(account.user, :reject?) }
.each { |account| SuspendAccountService.new.call(account, including_user: true, destroy: true, skip_distribution: true) }
.each { |account| SuspendAccountService.new.call(account, reserve_email: false, reserve_username: false) }
end
end

View file

@ -35,7 +35,7 @@ class Form::StatusBatch
def delete_statuses
Status.where(id: status_ids).reorder(nil).find_each do |status|
status.discard
RemovalWorker.perform_async(status.id, redraft: false)
RemovalWorker.perform_async(status.id, immediate: true)
Tombstone.find_or_create_by(uri: status.uri, account: status.account, by_moderator: true)
log_action :destroy, status
end

View file

@ -59,6 +59,7 @@ class Report < ApplicationRecord
end
def resolve!(acting_account)
RemovalWorker.push_bulk(Status.with_discarded.discarded.where(id: status_ids).pluck(:id)) { |status_id| [status_id, { immediate: true }] }
update!(action_taken: true, action_taken_by_account_id: acting_account.id)
end

View file

@ -214,6 +214,10 @@ class Status < ApplicationRecord
!sensitive? && with_media?
end
def reported?
@reported ||= Report.where(target_account: account).unresolved.where('? = ANY(status_ids)', id).exists?
end
def emojis
return @emojis if defined?(@emojis)

View file

@ -171,6 +171,10 @@ class User < ApplicationRecord
confirmed? && approved? && !disabled? && !account.suspended?
end
def unconfirmed_or_pending?
!(confirmed? && approved?)
end
def inactive_message
!approved? ? :pending : super
end