chatwoot/chatwoot

View on GitHub
enterprise/app/models/sla_event.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# == Schema Information
#
# Table name: sla_events
#
#  id              :bigint           not null, primary key
#  event_type      :integer
#  meta            :jsonb
#  created_at      :datetime         not null
#  updated_at      :datetime         not null
#  account_id      :bigint           not null
#  applied_sla_id  :bigint           not null
#  conversation_id :bigint           not null
#  inbox_id        :bigint           not null
#  sla_policy_id   :bigint           not null
#
# Indexes
#
#  index_sla_events_on_account_id       (account_id)
#  index_sla_events_on_applied_sla_id   (applied_sla_id)
#  index_sla_events_on_conversation_id  (conversation_id)
#  index_sla_events_on_inbox_id         (inbox_id)
#  index_sla_events_on_sla_policy_id    (sla_policy_id)
#
class SlaEvent < ApplicationRecord
  belongs_to :account
  belongs_to :inbox
  belongs_to :conversation
  belongs_to :sla_policy
  belongs_to :applied_sla

  enum event_type: { frt: 0, nrt: 1, rt: 2 }

  before_validation :ensure_applied_sla_id, :ensure_account_id, :ensure_inbox_id, :ensure_sla_policy_id
  after_create_commit :create_notifications

  def push_event_data
    {
      id: id,
      event_type: event_type,
      meta: meta,
      created_at: created_at.to_i,
      updated_at: updated_at.to_i
    }
  end

  private

  def ensure_applied_sla_id
    self.applied_sla_id ||= AppliedSla.find_by(conversation_id: conversation_id)&.last&.id
  end

  def ensure_account_id
    self.account_id ||= conversation&.account_id
  end

  def ensure_inbox_id
    self.inbox_id ||= conversation&.inbox_id
  end

  def ensure_sla_policy_id
    self.sla_policy_id ||= applied_sla&.sla_policy_id
  end

  def create_notifications
    notify_users = conversation.conversation_participants.map(&:user)
    # Add all admins from the account to notify list
    notify_users += account.administrators
    # Ensure conversation assignee is notified
    notify_users += [conversation.assignee] if conversation.assignee.present?

    notification_type = {
      'frt' => 'sla_missed_first_response',
      'nrt' => 'sla_missed_next_response',
      'rt' => 'sla_missed_resolution'
    }[event_type]

    notify_users.uniq.each do |user|
      NotificationBuilder.new(
        notification_type: notification_type,
        user: user,
        account: account,
        primary_actor: conversation,
        secondary_actor: sla_policy
      ).perform
    end
  end
end