Add preference for report notification e-mails, skip for duplicates (#8559)
If an unresolved report for the same target account already exists, no new notification is generated
This commit is contained in:
		@@ -46,7 +46,7 @@ class Settings::PreferencesController < ApplicationController
 | 
				
			|||||||
      :setting_noindex,
 | 
					      :setting_noindex,
 | 
				
			||||||
      :setting_theme,
 | 
					      :setting_theme,
 | 
				
			||||||
      :setting_hide_network,
 | 
					      :setting_hide_network,
 | 
				
			||||||
      notification_emails: %i(follow follow_request reblog favourite mention digest),
 | 
					      notification_emails: %i(follow follow_request reblog favourite mention digest report),
 | 
				
			||||||
      interactions: %i(must_be_follower must_be_following)
 | 
					      interactions: %i(must_be_follower must_be_following)
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,6 +60,10 @@ class Report < ApplicationRecord
 | 
				
			|||||||
    !action_taken?
 | 
					    !action_taken?
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def unresolved_siblings?
 | 
				
			||||||
 | 
					    Report.where.not(id: id).where(target_account_id: target_account_id).unresolved.exists?
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def history
 | 
					  def history
 | 
				
			||||||
    time_range = created_at..updated_at
 | 
					    time_range = created_at..updated_at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -224,6 +224,10 @@ class User < ApplicationRecord
 | 
				
			|||||||
    settings.notification_emails['digest']
 | 
					    settings.notification_emails['digest']
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  def allows_report_emails?
 | 
				
			||||||
 | 
					    settings.notification_emails['report']
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def hides_network?
 | 
					  def hides_network?
 | 
				
			||||||
    @hides_network ||= settings.hide_network
 | 
					    @hides_network ||= settings.hide_network
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,10 @@ class ReportService < BaseService
 | 
				
			|||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  def notify_staff!
 | 
					  def notify_staff!
 | 
				
			||||||
 | 
					    return if @report.unresolved_siblings?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    User.staff.includes(:account).each do |u|
 | 
					    User.staff.includes(:account).each do |u|
 | 
				
			||||||
 | 
					      next unless u.allows_report_emails?
 | 
				
			||||||
      AdminMailer.new_report(u.account, @report).deliver_later
 | 
					      AdminMailer.new_report(u.account, @report).deliver_later
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,6 +12,9 @@
 | 
				
			|||||||
      = ff.input :favourite, as: :boolean, wrapper: :with_label
 | 
					      = ff.input :favourite, as: :boolean, wrapper: :with_label
 | 
				
			||||||
      = ff.input :mention, as: :boolean, wrapper: :with_label
 | 
					      = ff.input :mention, as: :boolean, wrapper: :with_label
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - if current_user.staff?
 | 
				
			||||||
 | 
					        = ff.input :report, as: :boolean, wrapper: :with_label
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .fields-group
 | 
					  .fields-group
 | 
				
			||||||
    = f.simple_fields_for :notification_emails, hash_to_object(current_user.settings.notification_emails) do |ff|
 | 
					    = f.simple_fields_for :notification_emails, hash_to_object(current_user.settings.notification_emails) do |ff|
 | 
				
			||||||
      = ff.input :digest, as: :boolean, wrapper: :with_label
 | 
					      = ff.input :digest, as: :boolean, wrapper: :with_label
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -92,6 +92,7 @@ en:
 | 
				
			|||||||
        follow_request: Send e-mail when someone requests to follow you
 | 
					        follow_request: Send e-mail when someone requests to follow you
 | 
				
			||||||
        mention: Send e-mail when someone mentions you
 | 
					        mention: Send e-mail when someone mentions you
 | 
				
			||||||
        reblog: Send e-mail when someone boosts your status
 | 
					        reblog: Send e-mail when someone boosts your status
 | 
				
			||||||
 | 
					        report: Send e-mail when a new report is submitted
 | 
				
			||||||
    'no': 'No'
 | 
					    'no': 'No'
 | 
				
			||||||
    required:
 | 
					    required:
 | 
				
			||||||
      mark: "*"
 | 
					      mark: "*"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -39,6 +39,7 @@ defaults: &defaults
 | 
				
			|||||||
    mention: false
 | 
					    mention: false
 | 
				
			||||||
    follow_request: true
 | 
					    follow_request: true
 | 
				
			||||||
    digest: true
 | 
					    digest: true
 | 
				
			||||||
 | 
					    report: true
 | 
				
			||||||
  interactions:
 | 
					  interactions:
 | 
				
			||||||
    must_be_follower: false
 | 
					    must_be_follower: false
 | 
				
			||||||
    must_be_following: false
 | 
					    must_be_following: false
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,7 +3,7 @@ require 'rails_helper'
 | 
				
			|||||||
RSpec.describe ReportService, type: :service do
 | 
					RSpec.describe ReportService, type: :service do
 | 
				
			||||||
  subject { described_class.new }
 | 
					  subject { described_class.new }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  let(:source_account) { Fabricate(:account) }
 | 
					  let(:source_account) { Fabricate(:user).account }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  context 'for a remote account' do
 | 
					  context 'for a remote account' do
 | 
				
			||||||
    let(:remote_account) { Fabricate(:account, domain: 'example.com', protocol: :activitypub, inbox_url: 'http://example.com/inbox') }
 | 
					    let(:remote_account) { Fabricate(:account, domain: 'example.com', protocol: :activitypub, inbox_url: 'http://example.com/inbox') }
 | 
				
			||||||
@@ -22,4 +22,22 @@ RSpec.describe ReportService, type: :service do
 | 
				
			|||||||
      expect(a_request(:post, 'http://example.com/inbox')).to_not have_been_made
 | 
					      expect(a_request(:post, 'http://example.com/inbox')).to_not have_been_made
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  context 'when other reports already exist for the same target' do
 | 
				
			||||||
 | 
					    let!(:target_account) { Fabricate(:account) }
 | 
				
			||||||
 | 
					    let!(:other_report)   { Fabricate(:report, target_account: target_account) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    subject do
 | 
				
			||||||
 | 
					      -> {  described_class.new.call(source_account, target_account) }
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    before do
 | 
				
			||||||
 | 
					      ActionMailer::Base.deliveries.clear
 | 
				
			||||||
 | 
					      source_account.user.settings.notification_emails['report'] = true
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    it 'does not send an e-mail' do
 | 
				
			||||||
 | 
					      is_expected.to_not change(ActionMailer::Base.deliveries, :count).from(0)
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user