Followup PR for https://github.com/chatwoot/chatwoot/pull/10876. This PR just adds all the events related to conversation update to be reloaded before sending it to the UI.
45 lines
1.2 KiB
Ruby
45 lines
1.2 KiB
Ruby
class ActionCableBroadcastJob < ApplicationJob
|
|
queue_as :critical
|
|
include Events::Types
|
|
|
|
CONVERSATION_UPDATE_EVENTS = [
|
|
CONVERSATION_READ,
|
|
CONVERSATION_UPDATED,
|
|
TEAM_CHANGED,
|
|
ASSIGNEE_CHANGED,
|
|
CONVERSATION_STATUS_CHANGED
|
|
].freeze
|
|
|
|
def perform(members, event_name, data)
|
|
return if members.blank?
|
|
|
|
broadcast_data = prepare_broadcast_data(event_name, data)
|
|
broadcast_to_members(members, event_name, broadcast_data)
|
|
end
|
|
|
|
private
|
|
|
|
# Ensures that only the latest available data is sent to prevent UI issues
|
|
# caused by out-of-order events during high-traffic periods. This prevents
|
|
# the conversation job from processing outdated data.
|
|
def prepare_broadcast_data(event_name, data)
|
|
return data unless CONVERSATION_UPDATE_EVENTS.include?(event_name)
|
|
|
|
account = Account.find(data[:account_id])
|
|
conversation = account.conversations.find_by!(display_id: data[:id])
|
|
conversation.push_event_data.merge(account_id: data[:account_id])
|
|
end
|
|
|
|
def broadcast_to_members(members, event_name, broadcast_data)
|
|
members.each do |member|
|
|
ActionCable.server.broadcast(
|
|
member,
|
|
{
|
|
event: event_name,
|
|
data: broadcast_data
|
|
}
|
|
)
|
|
end
|
|
end
|
|
end
|