Change dismissing a notification to clear existing filtered notifications for that account (#31329)
This commit is contained in:
parent
6f285bb2a6
commit
670e4655d1
5 changed files with 61 additions and 1 deletions
|
@ -29,7 +29,7 @@ class Api::V1::Notifications::RequestsController < Api::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def dismiss
|
def dismiss
|
||||||
@request.destroy!
|
DismissNotificationRequestService.new.call(@request)
|
||||||
render_empty
|
render_empty
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
8
app/services/dismiss_notification_request_service.rb
Normal file
8
app/services/dismiss_notification_request_service.rb
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class DismissNotificationRequestService < BaseService
|
||||||
|
def call(request)
|
||||||
|
FilteredNotificationCleanupWorker.perform_async(request.account_id, request.from_account_id)
|
||||||
|
request.destroy!
|
||||||
|
end
|
||||||
|
end
|
9
app/workers/filtered_notification_cleanup_worker.rb
Normal file
9
app/workers/filtered_notification_cleanup_worker.rb
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class FilteredNotificationCleanupWorker
|
||||||
|
include Sidekiq::Worker
|
||||||
|
|
||||||
|
def perform(account_id, from_account_id)
|
||||||
|
Notification.where(account_id: account_id, from_account_id: from_account_id, filtered: true).reorder(nil).in_batches(order: :desc).delete_all
|
||||||
|
end
|
||||||
|
end
|
19
spec/services/dismiss_notification_request_service_spec.rb
Normal file
19
spec/services/dismiss_notification_request_service_spec.rb
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe DismissNotificationRequestService do
|
||||||
|
describe '#call' do
|
||||||
|
let(:sender) { Fabricate(:account) }
|
||||||
|
let(:receiver) { Fabricate(:account) }
|
||||||
|
let(:request) { Fabricate(:notification_request, account: receiver, from_account: sender) }
|
||||||
|
|
||||||
|
it 'destroys the request and queues a worker', :aggregate_failures do
|
||||||
|
expect { described_class.new.call(request) }
|
||||||
|
.to change(request, :destroyed?).to(true)
|
||||||
|
|
||||||
|
expect(FilteredNotificationCleanupWorker)
|
||||||
|
.to have_enqueued_sidekiq_job(receiver.id, sender.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
24
spec/workers/filtered_notification_cleanup_worker_spec.rb
Normal file
24
spec/workers/filtered_notification_cleanup_worker_spec.rb
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
describe FilteredNotificationCleanupWorker do
|
||||||
|
describe '#perform' do
|
||||||
|
let(:sender) { Fabricate(:account) }
|
||||||
|
let(:recipient) { Fabricate(:account) }
|
||||||
|
let(:bystander) { Fabricate(:account) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
Fabricate(:notification, account: recipient, activity: Fabricate(:favourite, account: sender), filtered: true)
|
||||||
|
Fabricate(:notification, account: recipient, activity: Fabricate(:favourite, account: bystander), filtered: true)
|
||||||
|
Fabricate(:notification, account: recipient, activity: Fabricate(:follow, account: sender), filtered: true)
|
||||||
|
Fabricate(:notification, account: recipient, activity: Fabricate(:favourite, account: bystander), filtered: true)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'deletes all filtered notifications to the account' do
|
||||||
|
expect { described_class.new.perform(recipient.id, sender.id) }
|
||||||
|
.to change { recipient.notifications.where(from_account: sender).count }.from(2).to(0)
|
||||||
|
.and(not_change { recipient.notifications.where(from_account: bystander).count })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue