mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-11 01:26:14 +00:00
* chore: Add sla_events to push_event_data * chore: Return SLA details in the API * chore: feature lock sla push event data * Update _conversation.json.jbuilder * chore: rubocop fixes
88 lines
2.4 KiB
Ruby
88 lines
2.4 KiB
Ruby
# == 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
|