feat: add activity message for SLA (#9100)
* feat: add activity message for SLA * chore: refactor to reduce method complexity * chore: refactor * feat: add spec for SLAactivity message * chore: move SLA spec to enterprise folder * chore: move team activity methods to a separate module * chore: fix typo * chore: move sla activity message spec to conversation model
This commit is contained in:
@@ -2,14 +2,48 @@ module ActivityMessageHandler
|
|||||||
extend ActiveSupport::Concern
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
include PriorityActivityMessageHandler
|
include PriorityActivityMessageHandler
|
||||||
|
include LabelActivityMessageHandler
|
||||||
|
include SlaActivityMessageHandler
|
||||||
|
include TeamActivityMessageHandler
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def create_activity
|
def create_activity
|
||||||
user_name = Current.user.name if Current.user.present?
|
user_name = determine_user_name
|
||||||
status_change_activity(user_name) if saved_change_to_status?
|
|
||||||
priority_change_activity(user_name) if saved_change_to_priority?
|
handle_status_change(user_name)
|
||||||
create_label_change(activity_message_ownner(user_name)) if saved_change_to_label_list?
|
handle_priority_change(user_name)
|
||||||
|
handle_label_change(user_name)
|
||||||
|
handle_sla_policy_change(user_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def determine_user_name
|
||||||
|
Current.user&.name
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_status_change(user_name)
|
||||||
|
return unless saved_change_to_status?
|
||||||
|
|
||||||
|
status_change_activity(user_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_priority_change(user_name)
|
||||||
|
return unless saved_change_to_priority?
|
||||||
|
|
||||||
|
priority_change_activity(user_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_label_change(user_name)
|
||||||
|
return unless saved_change_to_label_list?
|
||||||
|
|
||||||
|
create_label_change(activity_message_owner(user_name))
|
||||||
|
end
|
||||||
|
|
||||||
|
def handle_sla_policy_change(user_name)
|
||||||
|
return unless saved_change_to_sla_policy_id?
|
||||||
|
|
||||||
|
sla_change_type = determine_sla_change_type
|
||||||
|
create_sla_change_activity(sla_change_type, activity_message_owner(user_name))
|
||||||
end
|
end
|
||||||
|
|
||||||
def status_change_activity(user_name)
|
def status_change_activity(user_name)
|
||||||
@@ -45,21 +79,6 @@ module ActivityMessageHandler
|
|||||||
{ account_id: account_id, inbox_id: inbox_id, message_type: :activity, content: content }
|
{ account_id: account_id, inbox_id: inbox_id, message_type: :activity, content: content }
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_label_added(user_name, labels = [])
|
|
||||||
create_label_change_activity('added', user_name, labels)
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_label_removed(user_name, labels = [])
|
|
||||||
create_label_change_activity('removed', user_name, labels)
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_label_change_activity(change_type, user_name, labels = [])
|
|
||||||
return unless labels.size.positive?
|
|
||||||
|
|
||||||
content = I18n.t("conversations.activity.labels.#{change_type}", user_name: user_name, labels: labels.join(', '))
|
|
||||||
::Conversations::ActivityMessageJob.perform_later(self, activity_message_params(content)) if content
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_muted_message
|
def create_muted_message
|
||||||
create_mute_change_activity('muted')
|
create_mute_change_activity('muted')
|
||||||
end
|
end
|
||||||
@@ -75,30 +94,6 @@ module ActivityMessageHandler
|
|||||||
::Conversations::ActivityMessageJob.perform_later(self, activity_message_params(content)) if content
|
::Conversations::ActivityMessageJob.perform_later(self, activity_message_params(content)) if content
|
||||||
end
|
end
|
||||||
|
|
||||||
def generate_team_change_activity_key
|
|
||||||
team = Team.find_by(id: team_id)
|
|
||||||
key = team.present? ? 'assigned' : 'removed'
|
|
||||||
key += '_with_assignee' if key == 'assigned' && saved_change_to_assignee_id? && assignee
|
|
||||||
key
|
|
||||||
end
|
|
||||||
|
|
||||||
def generate_team_name_for_activity
|
|
||||||
previous_team_id = previous_changes[:team_id][0]
|
|
||||||
Team.find_by(id: previous_team_id)&.name if previous_team_id.present?
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_team_change_activity(user_name)
|
|
||||||
user_name = activity_message_ownner(user_name)
|
|
||||||
return unless user_name
|
|
||||||
|
|
||||||
key = generate_team_change_activity_key
|
|
||||||
params = { assignee_name: assignee&.name, team_name: team&.name, user_name: user_name }
|
|
||||||
params[:team_name] = generate_team_name_for_activity if key == 'removed'
|
|
||||||
content = I18n.t("conversations.activity.team.#{key}", **params)
|
|
||||||
|
|
||||||
::Conversations::ActivityMessageJob.perform_later(self, activity_message_params(content)) if content
|
|
||||||
end
|
|
||||||
|
|
||||||
def generate_assignee_change_activity_content(user_name)
|
def generate_assignee_change_activity_content(user_name)
|
||||||
params = { assignee_name: assignee&.name, user_name: user_name }.compact
|
params = { assignee_name: assignee&.name, user_name: user_name }.compact
|
||||||
key = assignee_id ? 'assigned' : 'removed'
|
key = assignee_id ? 'assigned' : 'removed'
|
||||||
@@ -107,7 +102,7 @@ module ActivityMessageHandler
|
|||||||
end
|
end
|
||||||
|
|
||||||
def create_assignee_change_activity(user_name)
|
def create_assignee_change_activity(user_name)
|
||||||
user_name = activity_message_ownner(user_name)
|
user_name = activity_message_owner(user_name)
|
||||||
|
|
||||||
return unless user_name
|
return unless user_name
|
||||||
|
|
||||||
@@ -115,7 +110,7 @@ module ActivityMessageHandler
|
|||||||
::Conversations::ActivityMessageJob.perform_later(self, activity_message_params(content)) if content
|
::Conversations::ActivityMessageJob.perform_later(self, activity_message_params(content)) if content
|
||||||
end
|
end
|
||||||
|
|
||||||
def activity_message_ownner(user_name)
|
def activity_message_owner(user_name)
|
||||||
user_name = 'Automation System' if !user_name && Current.executed_by.present?
|
user_name = 'Automation System' if !user_name && Current.executed_by.present?
|
||||||
user_name
|
user_name
|
||||||
end
|
end
|
||||||
|
|||||||
20
app/models/concerns/label_activity_message_handler.rb
Normal file
20
app/models/concerns/label_activity_message_handler.rb
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
module LabelActivityMessageHandler
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def create_label_added(user_name, labels = [])
|
||||||
|
create_label_change_activity('added', user_name, labels)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_label_removed(user_name, labels = [])
|
||||||
|
create_label_change_activity('removed', user_name, labels)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_label_change_activity(change_type, user_name, labels = [])
|
||||||
|
return unless labels.size.positive?
|
||||||
|
|
||||||
|
content = I18n.t("conversations.activity.labels.#{change_type}", user_name: user_name, labels: labels.join(', '))
|
||||||
|
::Conversations::ActivityMessageJob.perform_later(self, activity_message_params(content)) if content
|
||||||
|
end
|
||||||
|
end
|
||||||
31
app/models/concerns/sla_activity_message_handler.rb
Normal file
31
app/models/concerns/sla_activity_message_handler.rb
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
module SlaActivityMessageHandler
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def create_sla_change_activity(change_type, user_name)
|
||||||
|
content = case change_type
|
||||||
|
when 'added'
|
||||||
|
I18n.t('conversations.activity.sla.added', user_name: user_name, sla_name: sla_policy_name)
|
||||||
|
when 'removed'
|
||||||
|
I18n.t('conversations.activity.sla.removed', user_name: user_name, sla_name: sla_policy_name)
|
||||||
|
when 'updated'
|
||||||
|
I18n.t('conversations.activity.sla.updated', user_name: user_name, sla_name: sla_policy_name)
|
||||||
|
end
|
||||||
|
::Conversations::ActivityMessageJob.perform_later(self, activity_message_params(content)) if content
|
||||||
|
end
|
||||||
|
|
||||||
|
def sla_policy_name
|
||||||
|
SlaPolicy.find_by(id: sla_policy_id)&.name || ''
|
||||||
|
end
|
||||||
|
|
||||||
|
def determine_sla_change_type
|
||||||
|
sla_policy_id_before, sla_policy_id_after = previous_changes[:sla_policy_id]
|
||||||
|
|
||||||
|
if sla_policy_id_before.nil? && sla_policy_id_after.present?
|
||||||
|
'added'
|
||||||
|
elsif sla_policy_id_before.present? && sla_policy_id_after.nil?
|
||||||
|
'removed'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
29
app/models/concerns/team_activity_message_handler.rb
Normal file
29
app/models/concerns/team_activity_message_handler.rb
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
module TeamActivityMessageHandler
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def create_team_change_activity(user_name)
|
||||||
|
user_name = activity_message_owner(user_name)
|
||||||
|
return unless user_name
|
||||||
|
|
||||||
|
key = generate_team_change_activity_key
|
||||||
|
params = { assignee_name: assignee&.name, team_name: team&.name, user_name: user_name }
|
||||||
|
params[:team_name] = generate_team_name_for_activity if key == 'removed'
|
||||||
|
content = I18n.t("conversations.activity.team.#{key}", **params)
|
||||||
|
|
||||||
|
::Conversations::ActivityMessageJob.perform_later(self, activity_message_params(content)) if content
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_team_change_activity_key
|
||||||
|
team = Team.find_by(id: team_id)
|
||||||
|
key = team.present? ? 'assigned' : 'removed'
|
||||||
|
key += '_with_assignee' if key == 'assigned' && saved_change_to_assignee_id? && assignee
|
||||||
|
key
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_team_name_for_activity
|
||||||
|
previous_team_id = previous_changes[:team_id][0]
|
||||||
|
Team.find_by(id: previous_team_id)&.name if previous_team_id.present?
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -158,6 +158,9 @@ en:
|
|||||||
labels:
|
labels:
|
||||||
added: "%{user_name} added %{labels}"
|
added: "%{user_name} added %{labels}"
|
||||||
removed: "%{user_name} removed %{labels}"
|
removed: "%{user_name} removed %{labels}"
|
||||||
|
sla:
|
||||||
|
added: "%{user_name} added SLA policy %{sla_name}"
|
||||||
|
removed: "%{user_name} removed SLA policy %{sla_name}"
|
||||||
muted: "%{user_name} has muted the conversation"
|
muted: "%{user_name} has muted the conversation"
|
||||||
unmuted: "%{user_name} has unmuted the conversation"
|
unmuted: "%{user_name} has unmuted the conversation"
|
||||||
templates:
|
templates:
|
||||||
|
|||||||
@@ -5,6 +5,36 @@ RSpec.describe Conversation, type: :model do
|
|||||||
it { is_expected.to belong_to(:sla_policy).optional }
|
it { is_expected.to belong_to(:sla_policy).optional }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe 'SLA policy updates' do
|
||||||
|
let!(:conversation) { create(:conversation) }
|
||||||
|
let!(:sla_policy) { create(:sla_policy) }
|
||||||
|
|
||||||
|
it 'generates an activity message when the SLA policy is updated' do
|
||||||
|
conversation.update(sla_policy_id: sla_policy.id)
|
||||||
|
|
||||||
|
perform_enqueued_jobs
|
||||||
|
|
||||||
|
activity_message = conversation.messages.where(message_type: 'activity').last
|
||||||
|
|
||||||
|
expect(activity_message).not_to be_nil
|
||||||
|
expect(activity_message.message_type).to eq('activity')
|
||||||
|
expect(activity_message.content).to include('added SLA policy')
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'generates an activity message when the SLA policy is removed' do
|
||||||
|
conversation.update(sla_policy_id: sla_policy.id)
|
||||||
|
conversation.update(sla_policy_id: nil)
|
||||||
|
|
||||||
|
perform_enqueued_jobs
|
||||||
|
|
||||||
|
activity_message = conversation.messages.where(message_type: 'activity').last
|
||||||
|
|
||||||
|
expect(activity_message).not_to be_nil
|
||||||
|
expect(activity_message.message_type).to eq('activity')
|
||||||
|
expect(activity_message.content).to include('removed SLA policy')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe 'conversation sentiments' do
|
describe 'conversation sentiments' do
|
||||||
include ActiveJob::TestHelper
|
include ActiveJob::TestHelper
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user