]> cat aescling's git repositories - mastodon.git/commitdiff
Add preference for report notification e-mails, skip for duplicates (#8559)
authorEugen Rochko <eugen@zeonfederated.com>
Sat, 1 Sep 2018 22:11:58 +0000 (00:11 +0200)
committerGitHub <noreply@github.com>
Sat, 1 Sep 2018 22:11:58 +0000 (00:11 +0200)
If an unresolved report for the same target account already exists,
no new notification is generated

app/controllers/settings/preferences_controller.rb
app/models/report.rb
app/models/user.rb
app/services/report_service.rb
app/views/settings/notifications/show.html.haml
config/locales/simple_form.en.yml
config/settings.yml
spec/services/report_service_spec.rb

index e2cb131671d3e3ab70b3867aa093f601338142c6..b475c722d31d6db8afaa0ffb3e72cc752067d97b 100644 (file)
@@ -46,7 +46,7 @@ class Settings::PreferencesController < ApplicationController
       :setting_noindex,
       :setting_theme,
       :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)
     )
   end
index efe385b2dbb855e2882ee8c3b9f35f35c1fcdcb3..2804020f5273bcfca453adea85dc50230dab733e 100644 (file)
@@ -60,6 +60,10 @@ class Report < ApplicationRecord
     !action_taken?
   end
 
+  def unresolved_siblings?
+    Report.where.not(id: id).where(target_account_id: target_account_id).unresolved.exists?
+  end
+
   def history
     time_range = created_at..updated_at
 
index 25f77ed14e3c8bc2557a27fc470d79b6e4c325f3..d83df28c253cbff300ceb31fba8fb7b6434f4b16 100644 (file)
@@ -224,6 +224,10 @@ class User < ApplicationRecord
     settings.notification_emails['digest']
   end
 
+  def allows_report_emails?
+    settings.notification_emails['report']
+  end
+
   def hides_network?
     @hides_network ||= settings.hide_network
   end
index c06488a6de1628ce9491c3387b07950b173eba06..057d05ab9144d39d91479daeff248f2bf3e32567 100644 (file)
@@ -26,7 +26,10 @@ class ReportService < BaseService
   end
 
   def notify_staff!
+    return if @report.unresolved_siblings?
+
     User.staff.includes(:account).each do |u|
+      next unless u.allows_report_emails?
       AdminMailer.new_report(u.account, @report).deliver_later
     end
   end
index b718b62df5694f249df6618c116bf4dc5dbfd05b..8aaac043b711d013dfe2231c94fbda6718234542 100644 (file)
@@ -12,6 +12,9 @@
       = ff.input :favourite, 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
     = f.simple_fields_for :notification_emails, hash_to_object(current_user.settings.notification_emails) do |ff|
       = ff.input :digest, as: :boolean, wrapper: :with_label
index 59ebe0a7e0cb253c3028cee2630028d70efa8e05..2e4cb1effd8d105495b114cf145d820630d4e727 100644 (file)
@@ -92,6 +92,7 @@ en:
         follow_request: Send e-mail when someone requests to follow you
         mention: Send e-mail when someone mentions you
         reblog: Send e-mail when someone boosts your status
+        report: Send e-mail when a new report is submitted
     'no': 'No'
     required:
       mark: "*"
index 399f25a9a9a96d70e21e24e3a66b733ca3279fe4..78a801406c820becd09e9422b73a75defafaa04c 100644 (file)
@@ -39,6 +39,7 @@ defaults: &defaults
     mention: false
     follow_request: true
     digest: true
+    report: true
   interactions:
     must_be_follower: false
     must_be_following: false
index 2c392d37684f57b8c96ef1e96f6297b792db5d68..e8b094c89b2b686ca291e00537b8f11f737184c5 100644 (file)
@@ -3,7 +3,7 @@ require 'rails_helper'
 RSpec.describe ReportService, type: :service do
   subject { described_class.new }
 
-  let(:source_account) { Fabricate(:account) }
+  let(:source_account) { Fabricate(:user).account }
 
   context 'for a remote account' do
     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
     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