diff --git a/app/models/pager_tree/integrations/aws_cloudwatch/v3.rb b/app/models/pager_tree/integrations/aws_cloudwatch/v3.rb index 2da20ab..16c4df3 100644 --- a/app/models/pager_tree/integrations/aws_cloudwatch/v3.rb +++ b/app/models/pager_tree/integrations/aws_cloudwatch/v3.rb @@ -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 @@ -30,7 +29,6 @@ def adapter_action end end - # TODO: Implement your transform def adapter_process_create Alert.new( title: _title, diff --git a/app/models/pager_tree/integrations/freshdesk/v3.rb b/app/models/pager_tree/integrations/freshdesk/v3.rb new file mode 100644 index 0000000..13bda49 --- /dev/null +++ b/app/models/pager_tree/integrations/freshdesk/v3.rb @@ -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 diff --git a/app/views/pager_tree/integrations/freshdesk/v3/_form_options.html.erb b/app/views/pager_tree/integrations/freshdesk/v3/_form_options.html.erb new file mode 100644 index 0000000..e69de29 diff --git a/app/views/pager_tree/integrations/freshdesk/v3/_show_options.html.erb b/app/views/pager_tree/integrations/freshdesk/v3/_show_options.html.erb new file mode 100644 index 0000000..e69de29 diff --git a/config/locales/en.yml b/config/locales/en.yml index 6ad4354..760624d 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -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: diff --git a/test/fixtures/pager_tree/integrations/integrations.yml b/test/fixtures/pager_tree/integrations/integrations.yml index 40934f2..863277a 100644 --- a/test/fixtures/pager_tree/integrations/integrations.yml +++ b/test/fixtures/pager_tree/integrations/integrations.yml @@ -36,11 +36,9 @@ 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" @@ -48,10 +46,9 @@ live_call_routing_twilio_v3: 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 \ No newline at end of file diff --git a/test/models/pager_tree/integrations/freshdesk/v3_test.rb b/test/models/pager_tree/integrations/freshdesk/v3_test.rb new file mode 100644 index 0000000..72a8952 --- /dev/null +++ b/test/models/pager_tree/integrations/freshdesk/v3_test.rb @@ -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: "joe.bob@example.com", + 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