chore: Fix conversation status in webhooks (#3364)

- fix the wrong conversation status being sent in webhooks
- additional information in websocket events
- refactor activity messaging code
- move activity message generation to background job to stop the callback loop
This commit is contained in:
Sojan Jose
2021-11-12 16:17:59 +05:30
committed by GitHub
parent b119d9e729
commit d78cb67a2a
13 changed files with 219 additions and 136 deletions

View File

@@ -45,6 +45,7 @@ class Conversation < ApplicationRecord
include Labelable
include AssignmentHandler
include RoundRobinHandler
include ActivityMessageHandler
validates :account_id, presence: true
validates :inbox_id, presence: true
@@ -72,9 +73,7 @@ class Conversation < ApplicationRecord
before_save :ensure_snooze_until_reset
before_create :mark_conversation_pending_if_bot
# wanted to change this to after_update commit. But it ended up creating a loop
# reinvestigate in future and identity the implications
after_update :notify_status_change, :create_activity
after_update_commit :execute_after_update_commit_callbacks
after_create_commit :notify_conversation_creation, :queue_conversation_auto_resolution_job
after_commit :set_display_id, unless: :display_id?
@@ -150,6 +149,11 @@ class Conversation < ApplicationRecord
private
def execute_after_update_commit_callbacks
notify_status_change
create_activity
end
def ensure_snooze_until_reset
self.snoozed_until = nil unless snoozed?
end
@@ -168,6 +172,8 @@ class Conversation < ApplicationRecord
end
def queue_conversation_auto_resolution_job
# FIXME: Move this to one cronjob that iterates over accounts and enqueue resolution jobs
# Similar to how we handle campaigns
return unless auto_resolve_duration
AutoResolveConversationsJob.set(wait_until: (last_activity_at || created_at) + auto_resolve_duration.days).perform_later(id)
@@ -181,21 +187,6 @@ class Conversation < ApplicationRecord
reload
end
def create_activity
user_name = Current.user.name if Current.user.present?
status_change_activity(user_name) if saved_change_to_status?
create_label_change(user_name) if saved_change_to_label_list?
end
def status_change_activity(user_name)
create_status_change_message(user_name)
queue_conversation_auto_resolution_job if open?
end
def activity_message_params(content)
{ account_id: account_id, inbox_id: inbox_id, message_type: :activity, content: content }
end
def notify_status_change
{
CONVERSATION_OPENED => -> { saved_change_to_status? && open? },
@@ -218,16 +209,6 @@ class Conversation < ApplicationRecord
return true if previous_changes.key?(:id) || saved_change_to_status?
end
def create_status_change_message(user_name)
content = if user_name
I18n.t("conversations.activity.status.#{status}", user_name: user_name)
elsif resolved?
I18n.t('conversations.activity.status.auto_resolved', duration: auto_resolve_duration)
end
messages.create(activity_message_params(content)) if content
end
def create_label_change(user_name)
return unless user_name
@@ -238,42 +219,6 @@ class Conversation < ApplicationRecord
create_label_removed(user_name, previous_labels - current_labels)
end
def create_label_added(user_name, labels = [])
return unless labels.size.positive?
params = { user_name: user_name, labels: labels.join(', ') }
content = I18n.t('conversations.activity.labels.added', **params)
messages.create(activity_message_params(content))
end
def create_label_removed(user_name, labels = [])
return unless labels.size.positive?
params = { user_name: user_name, labels: labels.join(', ') }
content = I18n.t('conversations.activity.labels.removed', **params)
messages.create(activity_message_params(content))
end
def create_muted_message
return unless Current.user
params = { user_name: Current.user.name }
content = I18n.t('conversations.activity.muted', **params)
messages.create(activity_message_params(content))
end
def create_unmuted_message
return unless Current.user
params = { user_name: Current.user.name }
content = I18n.t('conversations.activity.unmuted', **params)
messages.create(activity_message_params(content))
end
def mute_key
format(Redis::RedisKeys::CONVERSATION_MUTE_KEY, id: id)
end