Skip to content

Commit 9d87e2c

Browse files
authored
Freshdesk (#28)
1 parent 956bfeb commit 9d87e2c

7 files changed

Lines changed: 192 additions & 9 deletions

File tree

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ class AwsCloudwatch::V3 < Integration
33
OPTIONS = []
44
store_accessor :options, *OPTIONS.map { |x| x[:key] }.map(&:to_s), prefix: "option"
55

6-
# TODO: Does this integration support incoming requests?
76
def adapter_supports_incoming?
87
true
98
end
@@ -30,7 +29,6 @@ def adapter_action
3029
end
3130
end
3231

33-
# TODO: Implement your transform
3432
def adapter_process_create
3533
Alert.new(
3634
title: _title,
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
module PagerTree::Integrations
2+
class Freshdesk::V3 < Integration
3+
FD_TICKET_STATUS = {
4+
open: 2,
5+
pending: 3,
6+
resolved: 4,
7+
closed: 5
8+
}
9+
10+
FD_TICKET_PRIORITY = {
11+
low: 1,
12+
medium: 2,
13+
high: 3,
14+
urgent: 4
15+
}
16+
17+
OPTIONS = []
18+
store_accessor :options, *OPTIONS.map { |x| x[:key] }.map(&:to_s), prefix: "option"
19+
20+
after_initialize do
21+
end
22+
23+
def adapter_supports_incoming?
24+
true
25+
end
26+
27+
def adapter_supports_outgoing?
28+
false
29+
end
30+
31+
def adapter_incoming_can_defer?
32+
true
33+
end
34+
35+
def adapter_thirdparty_id
36+
_freshdesk_webhook.dig("ticket_id")
37+
end
38+
39+
def adapter_action
40+
status = _freshdesk_webhook.dig("ticket_status")
41+
status_i = status&.to_i
42+
if status_i == FD_TICKET_STATUS[:open] || status == "Open" || status_i == FD_TICKET_STATUS[:pending] || status == "Pending"
43+
:create
44+
elsif status_i == FD_TICKET_STATUS[:resolved] || status == "Resolved" || status_i == FD_TICKET_STATUS[:closed] || status == "Closed"
45+
:resolve
46+
else
47+
:other
48+
end
49+
end
50+
51+
def adapter_process_create
52+
Alert.new(
53+
title: _title,
54+
description: _description,
55+
urgency: _urgency,
56+
thirdparty_id: adapter_thirdparty_id,
57+
dedup_keys: [adapter_thirdparty_id],
58+
additional_data: _additional_datums
59+
)
60+
end
61+
62+
private
63+
64+
def _freshdesk_webhook
65+
adapter_incoming_request_params.dig("freshdesk_webhook")
66+
end
67+
68+
def _title
69+
_freshdesk_webhook.dig("ticket_subject")
70+
end
71+
72+
def _description
73+
_freshdesk_webhook.dig("ticket_description")
74+
end
75+
76+
def _urgency
77+
priority = _freshdesk_webhook.dig("ticket_priority")
78+
priority_i = priority&.to_i
79+
80+
if priority_i == FD_TICKET_PRIORITY[:low] || priority == "Low"
81+
:low
82+
elsif priority_i == FD_TICKET_PRIORITY[:medium] || priority == "Normal"
83+
:medium
84+
elsif priority_i == FD_TICKET_PRIORITY[:high] || priority == "High"
85+
:high
86+
elsif priority_i == FD_TICKET_PRIORITY[:urgent] || priority == "Urgent"
87+
:critical
88+
end
89+
end
90+
91+
def _additional_datums
92+
[
93+
AdditionalDatum.new(format: "link", label: "Ticket URL", value: _freshdesk_webhook.dig("ticket_url")),
94+
AdditionalDatum.new(format: "datetime", label: "Due By", value: _freshdesk_webhook.dig("ticket_due_by_time")),
95+
AdditionalDatum.new(format: "text", label: "Source", value: _freshdesk_webhook.dig("ticket_source")),
96+
AdditionalDatum.new(format: "text", label: "Requester Name", value: _freshdesk_webhook.dig("ticket_requester_name")),
97+
AdditionalDatum.new(format: "text", label: "Requester Email", value: _freshdesk_webhook.dig("ticket_requester_email")),
98+
AdditionalDatum.new(format: "text", label: "Requester Phone", value: _freshdesk_webhook.dig("ticket_requester_phone")),
99+
AdditionalDatum.new(format: "text", label: "Company", value: _freshdesk_webhook.dig("ticket_company_name"))
100+
]
101+
end
102+
end
103+
end

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

Whitespace-only changes.

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

Whitespace-only changes.

config/locales/en.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ en:
3333
form_options:
3434
option_allow_spam_hint_html: "Allow emails marked as SPAM to create alerts"
3535
option_dedup_threads_hint_html: "Ignore emails from same thread (ex: Prevents new alerts for replys on emails (aka: RE:RE:RE...))"
36+
freshdesk:
37+
v3:
38+
form_options:
3639
live_call_routing:
3740
twilio:
3841
v3:

test/fixtures/pager_tree/integrations/integrations.yml

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,22 +36,19 @@ elast_alert_v3:
3636
type: "PagerTree::Integrations::ElastAlert::V3"
3737
# options: no_options
3838

39-
outgoing_webhook_v3:
40-
type: "PagerTree::Integrations::OutgoingWebhook::V3"
41-
options:
42-
webhook_url: "https://httpstat.us/200"
43-
alert_created: true
39+
freshdesk_v3:
40+
type: "PagerTree::Integrations::Freshdesk::V3"
41+
# options: no_options
4442

4543
live_call_routing_twilio_v3:
4644
type: "PagerTree::Integrations::LiveCallRouting::Twilio::V3"
4745
options:
4846
option_account_sid: a
4947
option_api_key: b
5048
option_api_secret: c
51-
5249

5350
outgoing_webhook_v3:
5451
type: "PagerTree::Integrations::OutgoingWebhook::V3"
5552
options:
5653
webhook_url: "https://httpstat.us/200"
57-
alert_created: true
54+
alert_created: true
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
require "test_helper"
2+
3+
module PagerTree::Integrations
4+
class Freshdesk::V3Test < ActiveSupport::TestCase
5+
include Integrateable
6+
7+
setup do
8+
@integration = pager_tree_integrations_integrations(:freshdesk_v3)
9+
10+
@create_request = {
11+
freshdesk_webhook: {
12+
ticket_id: "123",
13+
ticket_subject: "Ticket Subject",
14+
ticket_description: "Ticket Description",
15+
ticket_priority: 1,
16+
ticket_status: 2,
17+
ticket_url: "https://desk.freshdesk.com/ticket/123",
18+
ticket_due_by_time: "2022-05-23T08:18:26-05:00",
19+
ticket_source: "Customer",
20+
ticket_requester_name: "Joe Bob",
21+
ticket_requester_email: "joe.bob@example.com",
22+
ticket_requester_phone: nil,
23+
ticket_company_name: "Acme Corp"
24+
}
25+
}.with_indifferent_access
26+
27+
@resolve_request = @create_request.deep_dup
28+
@resolve_request[:freshdesk_webhook][:ticket_status] = "Resolved"
29+
30+
@other_request = @create_request.deep_dup
31+
@other_request[:freshdesk_webhook][:ticket_status] = "baaad"
32+
end
33+
34+
test "sanity" do
35+
assert @integration.adapter_supports_incoming?
36+
assert @integration.adapter_incoming_can_defer?
37+
assert_not @integration.adapter_supports_outgoing?
38+
assert @integration.adapter_show_alerts?
39+
assert @integration.adapter_show_logs?
40+
assert_not @integration.adapter_show_outgoing_webhook_delivery?
41+
end
42+
43+
test "adapter_actions" do
44+
@integration.adapter_incoming_request_params = @create_request
45+
assert_equal :create, @integration.adapter_action
46+
47+
@integration.adapter_incoming_request_params = @resolve_request
48+
assert_equal :resolve, @integration.adapter_action
49+
50+
@integration.adapter_incoming_request_params = @other_request
51+
assert_equal :other, @integration.adapter_action
52+
end
53+
54+
test "adapter_thirdparty_id" do
55+
@integration.adapter_incoming_request_params = @create_request
56+
assert_equal @create_request[:freshdesk_webhook][:ticket_id], @integration.adapter_thirdparty_id
57+
end
58+
59+
test "adapter_process_create" do
60+
@integration.adapter_incoming_request_params = @create_request
61+
62+
true_alert = Alert.new(
63+
title: @create_request[:freshdesk_webhook][:ticket_subject],
64+
description: @create_request[:freshdesk_webhook][:ticket_description],
65+
urgency: :low,
66+
thirdparty_id: @create_request[:freshdesk_webhook][:ticket_id],
67+
dedup_keys: [@create_request[:freshdesk_webhook][:ticket_id]],
68+
additional_data: [
69+
AdditionalDatum.new(format: "link", label: "Ticket URL", value: @create_request[:freshdesk_webhook].dig("ticket_url")),
70+
AdditionalDatum.new(format: "datetime", label: "Due By", value: @create_request[:freshdesk_webhook].dig("ticket_due_by_time")),
71+
AdditionalDatum.new(format: "text", label: "Source", value: @create_request[:freshdesk_webhook].dig("ticket_source")),
72+
AdditionalDatum.new(format: "text", label: "Requester Name", value: @create_request[:freshdesk_webhook].dig("ticket_requester_name")),
73+
AdditionalDatum.new(format: "text", label: "Requester Email", value: @create_request[:freshdesk_webhook].dig("ticket_requester_email")),
74+
AdditionalDatum.new(format: "text", label: "Requester Phone", value: @create_request[:freshdesk_webhook].dig("ticket_requester_phone")),
75+
AdditionalDatum.new(format: "text", label: "Company", value: @create_request[:freshdesk_webhook].dig("ticket_company_name"))
76+
]
77+
)
78+
79+
assert_equal true_alert.to_json, @integration.adapter_process_create.to_json
80+
end
81+
end
82+
end

0 commit comments

Comments
 (0)