Skip to content

Commit 7b3214b

Browse files
authored
Changes for a going on/off call webhook (#120)
1 parent b1997db commit 7b3214b

File tree

6 files changed

+67
-12
lines changed

6 files changed

+67
-12
lines changed

app/models/pager_tree/integrations/outgoing_event.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class OutgoingEvent
1313
attr_accessor :team
1414
attr_accessor :account_user
1515
attr_accessor :comment
16+
attr_accessor :event_reminder
1617

1718
define_model_callbacks :initialize
1819

@@ -33,6 +34,7 @@ def initialize(params = {})
3334
self.team ||= nil
3435
self.account_user ||= nil
3536
self.comment ||= nil
37+
self.event_reminder ||= nil
3638
end
3739
end
3840
end

app/models/pager_tree/integrations/outgoing_webhook/v3.rb

Lines changed: 56 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ class OutgoingWebhook::V3 < Integration
1212
{key: :alert_resolved, type: :boolean, default: false},
1313
{key: :alert_dropped, type: :boolean, default: false},
1414
{key: :alert_handoff, type: :boolean, default: false},
15+
{key: :event_reminder_going_on_call, type: :boolean, default: false},
16+
{key: :event_reminder_going_off_call, type: :boolean, default: false},
1517
{key: :template, type: :string, default: nil},
1618
{key: :send_linked, type: :boolean, default: false},
1719
{key: :outgoing_rules, type: :string, default: nil}
@@ -27,6 +29,8 @@ class OutgoingWebhook::V3 < Integration
2729
validates :option_alert_resolved, inclusion: {in: [true, false]}
2830
validates :option_alert_dropped, inclusion: {in: [true, false]}
2931
validates :option_alert_handoff, inclusion: {in: [true, false]}
32+
validates :option_event_reminder_going_on_call, inclusion: {in: [true, false]}
33+
validates :option_event_reminder_going_off_call, inclusion: {in: [true, false]}
3034
validates :option_send_linked, inclusion: {in: [true, false]}
3135

3236
after_initialize do
@@ -38,6 +42,8 @@ class OutgoingWebhook::V3 < Integration
3842
self.option_alert_resolved ||= false
3943
self.option_alert_dropped ||= false
4044
self.option_alert_handoff ||= false
45+
self.option_event_reminder_going_on_call ||= false
46+
self.option_event_reminder_going_off_call ||= false
4147
self.option_send_linked ||= false
4248
self.option_template ||= ""
4349
self.option_outgoing_rules ||= ""
@@ -73,28 +79,58 @@ def adapter_outgoing_interest?(event_name)
7379

7480
def adapter_process_outgoing
7581
body = nil
76-
event_type = adapter_outgoing_event.event_name.to_s.tr("_", ".")
82+
event_type = _map_event_name(adapter_outgoing_event.event_name)
83+
handlebars_data = {
84+
alert: adapter_outgoing_event.alert&.try(:v3_format) || adapter_outgoing_event&.alert,
85+
event: {
86+
type: event_type
87+
}
88+
}.compact
7789

7890
# Do the custom templating portion for outgoing hooks
7991
if self.option_template.present?
8092
begin
81-
body = JSON.parse(handlebars(self.option_template, {
82-
alert: adapter_outgoing_event.alert.try(:v3_format) || adapter_outgoing_event.alert,
83-
event: {
84-
type: event_type
85-
}
86-
}))
93+
body = JSON.parse(handlebars(self.option_template, handlebars_data))
8794
rescue JSON::ParserError => e
8895
logs.create(message: "Error parsing JSON, abort custom format for option template. Error: #{e.message}")
8996
rescue => e
9097
Rails.logger.error "Error while processing option_template for #{id}: #{e.message}"
9198
end
9299
end
93100

94-
body ||= {
95-
data: adapter_outgoing_event.alert.try(:v3_format) || adapter_outgoing_event.alert,
96-
type: event_type
97-
}
101+
if !body.present?
102+
body = {}
103+
body[:type] = event_type
104+
body[:data] = case event_type
105+
when "event_reminder.going_on_call", "event_reminder.going_off_call"
106+
{
107+
id: adapter_outgoing_event.event_reminder.id,
108+
prefix_id: adapter_outgoing_event.event_reminder.prefix_id,
109+
event: {
110+
id: adapter_outgoing_event.event_reminder.event.id,
111+
prefix_id: adapter_outgoing_event.event_reminder.event.prefix_id,
112+
start_time: adapter_outgoing_event.event_reminder.next_start.in_time_zone(adapter_outgoing_event.event_reminder.event.time_zone),
113+
end_time: adapter_outgoing_event.event_reminder.next_end.in_time_zone(adapter_outgoing_event.event_reminder.event.time_zone),
114+
time_zone: adapter_outgoing_event.event_reminder.event.time_zone,
115+
iana_time_zone: adapter_outgoing_event.event_reminder.event.iana_time_zone,
116+
layer: adapter_outgoing_event.event_reminder.event.layer,
117+
teams: adapter_outgoing_event.event_reminder.event.teams.map { |x| {id: x.id, tiny_id: x.tiny_id, prefix_id: x.prefix_id, name: x.name} },
118+
account_user: {
119+
id: adapter_outgoing_event.event_reminder.account_user.id,
120+
prefix_id: adapter_outgoing_event.event_reminder.account_user.prefix_id,
121+
user: {
122+
id: adapter_outgoing_event.event_reminder.account_user.user.id,
123+
prefix_id: adapter_outgoing_event.event_reminder.account_user.user.prefix_id,
124+
name: adapter_outgoing_event.event_reminder.account_user.user.name,
125+
email: adapter_outgoing_event.event_reminder.account_user.user.email
126+
}
127+
}
128+
}
129+
}
130+
else
131+
adapter_outgoing_event.alert&.try(:v3_format) || adapter_outgoing_event&.alert
132+
end
133+
end
98134

99135
url = adapter_outgoing_event.outgoing_rules_data.dig("webhook_url") || option_webhook_url
100136
body.merge!(adapter_outgoing_event.outgoing_rules_data.except("webhook_url"))
@@ -110,5 +146,14 @@ def adapter_process_outgoing
110146

111147
outgoing_webhook_delivery
112148
end
149+
150+
def _map_event_name(event_name)
151+
case event_name
152+
when "event_reminder_going_on_call" then "event_reminder.going_on_call"
153+
when "event_reminder_going_off_call" then "event_reminder.going_off_call"
154+
else
155+
event_name.to_s.tr("_", ".")
156+
end
157+
end
113158
end
114159
end

app/views/pager_tree/integrations/outgoing_webhook/v3/_form_options.html.erb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
:alert_resolved,
2828
:alert_dropped,
2929
:alert_handoff,
30+
:event_reminder_going_on_call,
31+
:event_reminder_going_off_call,
3032
:send_linked
3133
]
3234
%>

app/views/pager_tree/integrations/outgoing_webhook/v3/_show_options.html.erb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747
:alert_resolved,
4848
:alert_dropped,
4949
:alert_handoff,
50+
:event_reminder_going_on_call,
51+
:event_reminder_going_off_call,
5052
]
5153
%>
5254
<% opts.each do |opt| %>

config/locales/en.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ en:
1616
option_alert_resolved_hint_html: "Send when the alert is marked resolved"
1717
option_alert_dropped_hint_html: "Send when the alert is dropped"
1818
option_alert_handoff_hint_html: "Send when the alert has been handed off"
19+
option_event_reminder_going_on_call_hint_html: "Send when a user is going on call"
20+
option_event_reminder_going_off_call_hint_html: "Send when a user is going off call"
1921
option_template_hint_html: "A handlebars template describing the body that should be posted. See <a href='https://pagertree.com/docs/integration-guides/outgoing-webhook#custom-format' target='_blank'>docs</a> for details."
2022
option_send_linked_hint_html: "Send linked data (source, source_log, user, team)"
2123
channel:
@@ -143,6 +145,8 @@ en:
143145
option_alert_resolved: "alert.resolved"
144146
option_alert_dropped: "alert.dropped"
145147
option_alert_handoff: "alert.handoff"
148+
option_event_reminder_going_on_call: "event_reminder.going_on_call"
149+
option_event_reminder_going_off_call: "event_reminder.going_off_call"
146150
option_outgoing_rules: "Outgoing Rules"
147151
"pager_tree/integrations/apex_ping/v3":
148152
option_api_key: "API Key"

test/models/pager_tree/integrations/outgoing_webhook/v3_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class OutgoingWebhook::V3Test < ActiveSupport::TestCase
5252

5353
assert_equal @integration.option_webhook_url, outgoing_webhook_delivery.url
5454
assert_equal :queued.to_s, outgoing_webhook_delivery.status
55-
assert_equal expected_payload.to_json, outgoing_webhook_delivery.body.to_json
55+
assert_equal expected_payload.as_json, outgoing_webhook_delivery.body.as_json
5656
end
5757

5858
test "basic authorization works" do

0 commit comments

Comments
 (0)