From aad18e1ca4d08fa9a15ea2f92bbf5189cf2d8b76 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Fri, 1 Dec 2023 23:06:22 +0530 Subject: [PATCH] feat: Add `notification_deleted` action cable event (#8431) --- app/listeners/action_cable_listener.rb | 6 ++++++ app/models/notification.rb | 5 +++++ lib/events/types.rb | 1 + spec/listeners/action_cable_listener_spec.rb | 21 ++++++++++++++++++++ spec/models/notification_spec.rb | 2 +- 5 files changed, 34 insertions(+), 1 deletion(-) diff --git a/app/listeners/action_cable_listener.rb b/app/listeners/action_cable_listener.rb index ba5f2ed31..01e6b2735 100644 --- a/app/listeners/action_cable_listener.rb +++ b/app/listeners/action_cable_listener.rb @@ -7,6 +7,12 @@ class ActionCableListener < BaseListener broadcast(account, tokens, NOTIFICATION_CREATED, { notification: notification.push_event_data, unread_count: unread_count, count: count }) end + def notification_deleted(event) + notification, account, unread_count, count = extract_notification_and_account(event) + tokens = [event.data[:notification].user.pubsub_token] + broadcast(account, tokens, NOTIFICATION_DELETED, notification: notification, unread_count: unread_count, count: count) + end + def account_cache_invalidated(event) account = event.data[:account] tokens = user_tokens(account, account.agents) diff --git a/app/models/notification.rb b/app/models/notification.rb index 8fad75618..30c93c763 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -41,6 +41,7 @@ class Notification < ApplicationRecord enum notification_type: NOTIFICATION_TYPES after_create_commit :process_notification_delivery, :dispatch_create_event + after_destroy_commit :dispatch_destroy_event # TODO: Get rid of default scope # https://stackoverflow.com/a/1834250/939299 @@ -135,4 +136,8 @@ class Notification < ApplicationRecord def dispatch_create_event Rails.configuration.dispatcher.dispatch(NOTIFICATION_CREATED, Time.zone.now, notification: self) end + + def dispatch_destroy_event + Rails.configuration.dispatcher.dispatch(NOTIFICATION_DELETED, Time.zone.now, notification: self) + end end diff --git a/lib/events/types.rb b/lib/events/types.rb index 2693f5216..6e34fc358 100644 --- a/lib/events/types.rb +++ b/lib/events/types.rb @@ -48,6 +48,7 @@ module Events::Types # notification events NOTIFICATION_CREATED = 'notification.created' + NOTIFICATION_DELETED = 'notification.deleted' # agent events AGENT_ADDED = 'agent.added' diff --git a/spec/listeners/action_cable_listener_spec.rb b/spec/listeners/action_cable_listener_spec.rb index 276fadbf9..35983ab91 100644 --- a/spec/listeners/action_cable_listener_spec.rb +++ b/spec/listeners/action_cable_listener_spec.rb @@ -131,6 +131,27 @@ describe ActionCableListener do end end + 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) } + + it 'sends message to account admins, inbox agents' do + expect(ActionCableBroadcastJob).to receive(:perform_later).with( + [agent.pubsub_token], + 'notification.deleted', + { + account_id: notification.account_id, + notification: notification, + unread_count: 1, + count: 1 + } + ) + + listener.notification_deleted(event) + end + end + describe '#conversation_updated' do let(:event_name) { :'conversation.updated' } let!(:event) { Events::Base.new(event_name, Time.zone.now, conversation: conversation, user: agent, is_private: false) } diff --git a/spec/models/notification_spec.rb b/spec/models/notification_spec.rb index 71a6209ad..00de30cfb 100644 --- a/spec/models/notification_spec.rb +++ b/spec/models/notification_spec.rb @@ -134,7 +134,7 @@ Hey @John, @Alisha Peter can you check this ticket?" end end - context 'when primary actory is deleted' do + context 'when primary actor is deleted' do let!(:conversation) { create(:conversation) } it 'clears notifications' do