Change dismissing a notification to clear existing filtered notifications for that account (#31329)

This commit is contained in:
Claire 2024-08-07 17:14:37 +02:00 committed by GitHub
parent 6f285bb2a6
commit 670e4655d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 61 additions and 1 deletions

View file

@ -29,7 +29,7 @@ class Api::V1::Notifications::RequestsController < Api::BaseController
end
def dismiss
@request.destroy!
DismissNotificationRequestService.new.call(@request)
render_empty
end

View 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

View 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

View 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

View 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