Skip to content

Commit

Permalink
Freshdesk (#28)
Browse files Browse the repository at this point in the history
  • Loading branch information
armiiller authored May 23, 2022
1 parent 956bfeb commit 9d87e2c
Show file tree
Hide file tree
Showing 7 changed files with 192 additions and 9 deletions.
2 changes: 0 additions & 2 deletions app/models/pager_tree/integrations/aws_cloudwatch/v3.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ class AwsCloudwatch::V3 < Integration
OPTIONS = []
store_accessor :options, *OPTIONS.map { |x| x[:key] }.map(&:to_s), prefix: "option"

# TODO: Does this integration support incoming requests?
def adapter_supports_incoming?
true
end
Expand All @@ -30,7 +29,6 @@ def adapter_action
end
end

# TODO: Implement your transform
def adapter_process_create
Alert.new(
title: _title,
Expand Down
103 changes: 103 additions & 0 deletions app/models/pager_tree/integrations/freshdesk/v3.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
module PagerTree::Integrations
class Freshdesk::V3 < Integration
FD_TICKET_STATUS = {
open: 2,
pending: 3,
resolved: 4,
closed: 5
}

FD_TICKET_PRIORITY = {
low: 1,
medium: 2,
high: 3,
urgent: 4
}

OPTIONS = []
store_accessor :options, *OPTIONS.map { |x| x[:key] }.map(&:to_s), prefix: "option"

after_initialize do
end

def adapter_supports_incoming?
true
end

def adapter_supports_outgoing?
false
end

def adapter_incoming_can_defer?
true
end

def adapter_thirdparty_id
_freshdesk_webhook.dig("ticket_id")
end

def adapter_action
status = _freshdesk_webhook.dig("ticket_status")
status_i = status&.to_i
if status_i == FD_TICKET_STATUS[:open] || status == "Open" || status_i == FD_TICKET_STATUS[:pending] || status == "Pending"
:create
elsif status_i == FD_TICKET_STATUS[:resolved] || status == "Resolved" || status_i == FD_TICKET_STATUS[:closed] || status == "Closed"
:resolve
else
:other
end
end

def adapter_process_create
Alert.new(
title: _title,
description: _description,
urgency: _urgency,
thirdparty_id: adapter_thirdparty_id,
dedup_keys: [adapter_thirdparty_id],
additional_data: _additional_datums
)
end

private

def _freshdesk_webhook
adapter_incoming_request_params.dig("freshdesk_webhook")
end

def _title
_freshdesk_webhook.dig("ticket_subject")
end

def _description
_freshdesk_webhook.dig("ticket_description")
end

def _urgency
priority = _freshdesk_webhook.dig("ticket_priority")
priority_i = priority&.to_i

if priority_i == FD_TICKET_PRIORITY[:low] || priority == "Low"
:low
elsif priority_i == FD_TICKET_PRIORITY[:medium] || priority == "Normal"
:medium
elsif priority_i == FD_TICKET_PRIORITY[:high] || priority == "High"
:high
elsif priority_i == FD_TICKET_PRIORITY[:urgent] || priority == "Urgent"
:critical
end
end

def _additional_datums
[
AdditionalDatum.new(format: "link", label: "Ticket URL", value: _freshdesk_webhook.dig("ticket_url")),
AdditionalDatum.new(format: "datetime", label: "Due By", value: _freshdesk_webhook.dig("ticket_due_by_time")),
AdditionalDatum.new(format: "text", label: "Source", value: _freshdesk_webhook.dig("ticket_source")),
AdditionalDatum.new(format: "text", label: "Requester Name", value: _freshdesk_webhook.dig("ticket_requester_name")),
AdditionalDatum.new(format: "text", label: "Requester Email", value: _freshdesk_webhook.dig("ticket_requester_email")),
AdditionalDatum.new(format: "text", label: "Requester Phone", value: _freshdesk_webhook.dig("ticket_requester_phone")),
AdditionalDatum.new(format: "text", label: "Company", value: _freshdesk_webhook.dig("ticket_company_name"))
]
end
end
end
Empty file.
Empty file.
3 changes: 3 additions & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,9 @@ en:
form_options:
option_allow_spam_hint_html: "Allow emails marked as SPAM to create alerts"
option_dedup_threads_hint_html: "Ignore emails from same thread (ex: Prevents new alerts for replys on emails (aka: RE:RE:RE...))"
freshdesk:
v3:
form_options:
live_call_routing:
twilio:
v3:
Expand Down
11 changes: 4 additions & 7 deletions test/fixtures/pager_tree/integrations/integrations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,22 +36,19 @@ elast_alert_v3:
type: "PagerTree::Integrations::ElastAlert::V3"
# options: no_options

outgoing_webhook_v3:
type: "PagerTree::Integrations::OutgoingWebhook::V3"
options:
webhook_url: "https://httpstat.us/200"
alert_created: true
freshdesk_v3:
type: "PagerTree::Integrations::Freshdesk::V3"
# options: no_options

live_call_routing_twilio_v3:
type: "PagerTree::Integrations::LiveCallRouting::Twilio::V3"
options:
option_account_sid: a
option_api_key: b
option_api_secret: c


outgoing_webhook_v3:
type: "PagerTree::Integrations::OutgoingWebhook::V3"
options:
webhook_url: "https://httpstat.us/200"
alert_created: true
alert_created: true
82 changes: 82 additions & 0 deletions test/models/pager_tree/integrations/freshdesk/v3_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
require "test_helper"

module PagerTree::Integrations
class Freshdesk::V3Test < ActiveSupport::TestCase
include Integrateable

setup do
@integration = pager_tree_integrations_integrations(:freshdesk_v3)

@create_request = {
freshdesk_webhook: {
ticket_id: "123",
ticket_subject: "Ticket Subject",
ticket_description: "Ticket Description",
ticket_priority: 1,
ticket_status: 2,
ticket_url: "https://desk.freshdesk.com/ticket/123",
ticket_due_by_time: "2022-05-23T08:18:26-05:00",
ticket_source: "Customer",
ticket_requester_name: "Joe Bob",
ticket_requester_email: "[email protected]",
ticket_requester_phone: nil,
ticket_company_name: "Acme Corp"
}
}.with_indifferent_access

@resolve_request = @create_request.deep_dup
@resolve_request[:freshdesk_webhook][:ticket_status] = "Resolved"

@other_request = @create_request.deep_dup
@other_request[:freshdesk_webhook][:ticket_status] = "baaad"
end

test "sanity" do
assert @integration.adapter_supports_incoming?
assert @integration.adapter_incoming_can_defer?
assert_not @integration.adapter_supports_outgoing?
assert @integration.adapter_show_alerts?
assert @integration.adapter_show_logs?
assert_not @integration.adapter_show_outgoing_webhook_delivery?
end

test "adapter_actions" do
@integration.adapter_incoming_request_params = @create_request
assert_equal :create, @integration.adapter_action

@integration.adapter_incoming_request_params = @resolve_request
assert_equal :resolve, @integration.adapter_action

@integration.adapter_incoming_request_params = @other_request
assert_equal :other, @integration.adapter_action
end

test "adapter_thirdparty_id" do
@integration.adapter_incoming_request_params = @create_request
assert_equal @create_request[:freshdesk_webhook][:ticket_id], @integration.adapter_thirdparty_id
end

test "adapter_process_create" do
@integration.adapter_incoming_request_params = @create_request

true_alert = Alert.new(
title: @create_request[:freshdesk_webhook][:ticket_subject],
description: @create_request[:freshdesk_webhook][:ticket_description],
urgency: :low,
thirdparty_id: @create_request[:freshdesk_webhook][:ticket_id],
dedup_keys: [@create_request[:freshdesk_webhook][:ticket_id]],
additional_data: [
AdditionalDatum.new(format: "link", label: "Ticket URL", value: @create_request[:freshdesk_webhook].dig("ticket_url")),
AdditionalDatum.new(format: "datetime", label: "Due By", value: @create_request[:freshdesk_webhook].dig("ticket_due_by_time")),
AdditionalDatum.new(format: "text", label: "Source", value: @create_request[:freshdesk_webhook].dig("ticket_source")),
AdditionalDatum.new(format: "text", label: "Requester Name", value: @create_request[:freshdesk_webhook].dig("ticket_requester_name")),
AdditionalDatum.new(format: "text", label: "Requester Email", value: @create_request[:freshdesk_webhook].dig("ticket_requester_email")),
AdditionalDatum.new(format: "text", label: "Requester Phone", value: @create_request[:freshdesk_webhook].dig("ticket_requester_phone")),
AdditionalDatum.new(format: "text", label: "Company", value: @create_request[:freshdesk_webhook].dig("ticket_company_name"))
]
)

assert_equal true_alert.to_json, @integration.adapter_process_create.to_json
end
end
end

0 comments on commit 9d87e2c

Please sign in to comment.