diff --git a/app/models/concerns/activity_message_handler.rb b/app/models/concerns/activity_message_handler.rb index 3c53b6798..d49442f10 100644 --- a/app/models/concerns/activity_message_handler.rb +++ b/app/models/concerns/activity_message_handler.rb @@ -2,14 +2,48 @@ module ActivityMessageHandler extend ActiveSupport::Concern include PriorityActivityMessageHandler + include LabelActivityMessageHandler + include SlaActivityMessageHandler + include TeamActivityMessageHandler private def create_activity - user_name = Current.user.name if Current.user.present? - status_change_activity(user_name) if saved_change_to_status? - priority_change_activity(user_name) if saved_change_to_priority? - create_label_change(activity_message_ownner(user_name)) if saved_change_to_label_list? + user_name = determine_user_name + + handle_status_change(user_name) + 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 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 } 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 create_mute_change_activity('muted') end @@ -75,30 +94,6 @@ module ActivityMessageHandler ::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 - - 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) params = { assignee_name: assignee&.name, user_name: user_name }.compact key = assignee_id ? 'assigned' : 'removed' @@ -107,7 +102,7 @@ module ActivityMessageHandler end 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 @@ -115,7 +110,7 @@ module ActivityMessageHandler ::Conversations::ActivityMessageJob.perform_later(self, activity_message_params(content)) if content 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 end diff --git a/app/models/concerns/label_activity_message_handler.rb b/app/models/concerns/label_activity_message_handler.rb new file mode 100644 index 000000000..d5097e00f --- /dev/null +++ b/app/models/concerns/label_activity_message_handler.rb @@ -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 diff --git a/app/models/concerns/sla_activity_message_handler.rb b/app/models/concerns/sla_activity_message_handler.rb new file mode 100644 index 000000000..94603161e --- /dev/null +++ b/app/models/concerns/sla_activity_message_handler.rb @@ -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 diff --git a/app/models/concerns/team_activity_message_handler.rb b/app/models/concerns/team_activity_message_handler.rb new file mode 100644 index 000000000..aba5237c4 --- /dev/null +++ b/app/models/concerns/team_activity_message_handler.rb @@ -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 diff --git a/config/locales/en.yml b/config/locales/en.yml index 5a3816867..c19499fa5 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -158,6 +158,9 @@ en: labels: added: "%{user_name} added %{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" unmuted: "%{user_name} has unmuted the conversation" templates: diff --git a/spec/enterprise/models/conversation_spec.rb b/spec/enterprise/models/conversation_spec.rb index e91f3f885..bb3ced5b3 100644 --- a/spec/enterprise/models/conversation_spec.rb +++ b/spec/enterprise/models/conversation_spec.rb @@ -5,6 +5,36 @@ RSpec.describe Conversation, type: :model do it { is_expected.to belong_to(:sla_policy).optional } 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 include ActiveJob::TestHelper