feat: add push notification when SLA missed (#9078)

* feat: add push notification when SLA missed

* chore: sent notification only for inbox members

* feat: add conv particpants+admins to SLA notification list

* chore: add spec to ensure notification is created

* chore: refactor to multiple alerts for SLA conditions

* chore: add sla_policy as secondary_actor in notification
This commit is contained in:
Vishnu Narayanan
2024-03-11 21:49:41 +05:30
committed by GitHub
parent 0685e04aae
commit aaf70cf1cf
7 changed files with 114 additions and 19 deletions

View File

@@ -22,4 +22,14 @@ class SlaPolicy < ApplicationRecord
validates :name, presence: true
has_many :conversations, dependent: :nullify
def push_event_data
{
id: id,
name: name,
frt: first_response_time_threshold,
nrt: next_response_time_threshold,
rt: resolution_time_threshold
}
end
end

View File

@@ -30,7 +30,7 @@ class Sla::EvaluateAppliedSlaService
return if first_reply_was_within_threshold?(conversation, threshold)
return if still_within_threshold?(threshold)
handle_missed_sla(applied_sla)
handle_missed_sla(applied_sla, 'frt')
end
def first_reply_was_within_threshold?(conversation, threshold)
@@ -46,7 +46,7 @@ class Sla::EvaluateAppliedSlaService
threshold = conversation.waiting_since.to_i + sla_policy.next_response_time_threshold.to_i
return if still_within_threshold?(threshold)
handle_missed_sla(applied_sla)
handle_missed_sla(applied_sla, 'nrt')
end
def check_resolution_time_threshold(applied_sla, conversation, sla_policy)
@@ -55,13 +55,14 @@ class Sla::EvaluateAppliedSlaService
threshold = conversation.created_at.to_i + sla_policy.resolution_time_threshold.to_i
return if still_within_threshold?(threshold)
handle_missed_sla(applied_sla)
handle_missed_sla(applied_sla, 'rt')
end
def handle_missed_sla(applied_sla)
def handle_missed_sla(applied_sla, type)
return unless applied_sla.active?
applied_sla.update!(sla_status: 'missed')
generate_notifications_for_sla(applied_sla, type)
Rails.logger.warn "SLA missed for conversation #{applied_sla.conversation.id} " \
"in account #{applied_sla.account_id} " \
"for sla_policy #{applied_sla.sla_policy.id}"
@@ -75,4 +76,30 @@ class Sla::EvaluateAppliedSlaService
"in account #{applied_sla.account_id} " \
"for sla_policy #{applied_sla.sla_policy.id}"
end
def generate_notifications_for_sla(applied_sla, type)
notify_users = applied_sla.conversation.conversation_participants.map(&:user)
# add all admins from the account to notify list
notify_users += applied_sla.account.administrators
# ensure conversation assignee is notified
notify_users += [applied_sla.conversation.assignee] if applied_sla.conversation.assignee.present?
notification_type = if type == 'frt'
'sla_missed_first_response'
elsif type == 'nrt'
'sla_missed_next_response'
else
'sla_missed_resolution'
end
notify_users.uniq.each do |user|
NotificationBuilder.new(
notification_type: notification_type,
user: user,
account: applied_sla.account,
primary_actor: applied_sla.conversation,
secondary_actor: applied_sla.sla_policy
).perform
end
end
end