forked from fedi/mastodon
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:
parent
a060beee72
commit
c593d6df9c
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue