fix: Move contact events to account stream rather than individual user stream (#11082)

This commit is contained in:
Pranav
2025-03-13 17:46:48 -07:00
committed by GitHub
parent a8001ccabc
commit 325dc4a741
4 changed files with 28 additions and 22 deletions

View File

@@ -2,10 +2,9 @@ class RoomChannel < ApplicationCable::Channel
def subscribed
# TODO: should we only do ensure stream if current account is present?
# for now going ahead with guard clauses in update_subscription and broadcast_presence
ensure_stream
current_user
current_account
ensure_stream
update_subscription
broadcast_presence
end
@@ -22,12 +21,12 @@ class RoomChannel < ApplicationCable::Channel
data = { account_id: @current_account.id, users: ::OnlineStatusTracker.get_available_users(@current_account.id) }
data[:contacts] = ::OnlineStatusTracker.get_available_contacts(@current_account.id) if @current_user.is_a? User
ActionCable.server.broadcast(@pubsub_token, { event: 'presence.update', data: data })
ActionCable.server.broadcast(pubsub_token, { event: 'presence.update', data: data })
end
def ensure_stream
@pubsub_token = params[:pubsub_token]
stream_from @pubsub_token
stream_from pubsub_token
stream_from "account_#{@current_account.id}" if @current_account.present? && @current_user.is_a?(User)
end
def update_subscription
@@ -36,11 +35,15 @@ class RoomChannel < ApplicationCable::Channel
::OnlineStatusTracker.update_presence(@current_account.id, @current_user.class.name, @current_user.id)
end
def pubsub_token
@pubsub_token ||= params[:pubsub_token]
end
def current_user
@current_user ||= if params[:user_id].blank?
ContactInbox.find_by!(pubsub_token: @pubsub_token).contact
ContactInbox.find_by!(pubsub_token: pubsub_token).contact
else
User.find_by!(pubsub_token: @pubsub_token, id: params[:user_id])
User.find_by!(pubsub_token: pubsub_token, id: params[:user_id])
end
end

View File

@@ -137,30 +137,22 @@ class ActionCableListener < BaseListener
def contact_created(event)
contact, account = extract_contact_and_account(event)
tokens = user_tokens(account, account.agents)
broadcast(account, tokens, CONTACT_CREATED, contact.push_event_data)
broadcast(account, [account_token(account)], CONTACT_CREATED, contact.push_event_data)
end
def contact_updated(event)
contact, account = extract_contact_and_account(event)
tokens = user_tokens(account, account.agents)
broadcast(account, tokens, CONTACT_UPDATED, contact.push_event_data)
broadcast(account, [account_token(account)], CONTACT_UPDATED, contact.push_event_data)
end
def contact_merged(event)
contact, account = extract_contact_and_account(event)
tokens = event.data[:tokens]
broadcast(account, tokens, CONTACT_MERGED, contact.push_event_data)
broadcast(account, [account_token(account)], CONTACT_MERGED, contact.push_event_data)
end
def contact_deleted(event)
contact, account = extract_contact_and_account(event)
tokens = user_tokens(account, account.agents)
broadcast(account, tokens, CONTACT_DELETED, contact.push_event_data)
broadcast(account, [account_token(account)], CONTACT_DELETED, contact.push_event_data)
end
def conversation_mentioned(event)
@@ -172,6 +164,10 @@ class ActionCableListener < BaseListener
private
def account_token(account)
"account_#{account.id}"
end
def typing_event_listener_tokens(account, conversation, user)
current_user_token = user.is_a?(Contact) ? conversation.contact_inbox.pubsub_token : user.pubsub_token
(user_tokens(account, conversation.inbox.members) + [conversation.contact_inbox.pubsub_token]) - [current_user_token]