diff --git a/app/listeners/action_cable_listener.rb b/app/listeners/action_cable_listener.rb index 109f6d344..48b7a3aa9 100644 --- a/app/listeners/action_cable_listener.rb +++ b/app/listeners/action_cable_listener.rb @@ -14,11 +14,19 @@ class ActionCableListener < BaseListener end def notification_deleted(event) - return if event.data[:notification].user.blank? + notification_data = event.data[:notification_data] - notification, account, unread_count, count = extract_notification_and_account(event) - tokens = [event.data[:notification].user.pubsub_token] - broadcast(account, tokens, NOTIFICATION_DELETED, { notification: { id: notification.id }, unread_count: unread_count, count: count }) + user = User.find_by(id: notification_data[:user_id]) + account = Account.find_by(id: notification_data[:account_id]) + return if user.blank? || account.blank? + + notification_finder = NotificationFinder.new(user, account) + tokens = [user.pubsub_token] + broadcast(account, tokens, NOTIFICATION_DELETED, { + notification: { id: notification_data[:id] }, + unread_count: notification_finder.unread_count, + count: notification_finder.count + }) end def account_cache_invalidated(event) diff --git a/app/models/notification.rb b/app/models/notification.rb index db07e3679..806eabdf1 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -180,7 +180,17 @@ class Notification < ApplicationRecord end def dispatch_destroy_event - Rails.configuration.dispatcher.dispatch(NOTIFICATION_DELETED, Time.zone.now, notification: self) + # Pass serialized data instead of ActiveRecord object to avoid DeserializationError + # when the async EventDispatcherJob runs after the notification has been deleted + Rails.configuration.dispatcher.dispatch( + NOTIFICATION_DELETED, + Time.zone.now, + notification_data: { + id: id, + user_id: user_id, + account_id: account_id + } + ) end def set_last_activity_at diff --git a/spec/listeners/action_cable_listener_spec.rb b/spec/listeners/action_cable_listener_spec.rb index 55b74116c..61f818da1 100644 --- a/spec/listeners/action_cable_listener_spec.rb +++ b/spec/listeners/action_cable_listener_spec.rb @@ -132,7 +132,14 @@ describe ActionCableListener do describe '#notification_deleted' do let(:event_name) { :'notification.deleted' } let!(:notification) { create(:notification, account: account, user: agent) } - let!(:event) { Events::Base.new(event_name, Time.zone.now, notification: notification) } + let(:notification_data) do + { + id: notification.id, + user_id: agent.id, + account_id: account.id + } + end + let!(:event) { Events::Base.new(event_name, Time.zone.now, notification_data: notification_data) } it 'sends message to account admins, inbox agents' do expect(ActionCableBroadcastJob).to receive(:perform_later).with(