pager_tree-integrations 1.0.1 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. checksums.yaml +4 -4
  2. data/app/models/pager_tree/integrations/alert.rb +3 -1
  3. data/app/models/pager_tree/integrations/app_dynamics/v3.rb +74 -0
  4. data/app/models/pager_tree/integrations/auvik/v3.rb +94 -0
  5. data/app/models/pager_tree/integrations/aws_cloudwatch/v3.rb +108 -0
  6. data/app/models/pager_tree/integrations/azure_monitor/v3.rb +79 -0
  7. data/app/models/pager_tree/integrations/boolean_store_accessor.rb +42 -0
  8. data/app/models/pager_tree/integrations/channel/hangouts/v3.rb +176 -0
  9. data/app/models/pager_tree/integrations/channel/mattermost/v3.rb +6 -0
  10. data/app/models/pager_tree/integrations/channel/microsoft_teams/v3.rb +142 -0
  11. data/app/models/pager_tree/integrations/channel/slack/v3.rb +136 -0
  12. data/app/models/pager_tree/integrations/cronitor/v3.rb +64 -0
  13. data/app/models/pager_tree/integrations/datadog/v3.rb +72 -0
  14. data/app/models/pager_tree/integrations/dead_mans_snitch/v3.rb +76 -0
  15. data/app/models/pager_tree/integrations/elast_alert/v3.rb +63 -0
  16. data/app/models/pager_tree/integrations/form/v3.rb +114 -0
  17. data/app/models/pager_tree/integrations/freshdesk/v3.rb +103 -0
  18. data/app/models/pager_tree/integrations/freshservice/v3.rb +103 -0
  19. data/app/models/pager_tree/integrations/grafana/v3.rb +67 -0
  20. data/app/models/pager_tree/integrations/healthchecks/v3.rb +68 -0
  21. data/app/models/pager_tree/integrations/honeybadger/v3.rb +76 -0
  22. data/app/models/pager_tree/integrations/hyperping/v3.rb +60 -0
  23. data/app/models/pager_tree/integrations/integration.rb +27 -5
  24. data/app/models/pager_tree/integrations/jira_server/v3.rb +61 -0
  25. data/app/models/pager_tree/integrations/jotform/v3.rb +50 -0
  26. data/app/models/pager_tree/integrations/kapacitor/v3.rb +65 -0
  27. data/app/models/pager_tree/integrations/logic_monitor/v3.rb +79 -0
  28. data/app/models/pager_tree/integrations/mattermost/outgoing_webhook/v3.rb +77 -0
  29. data/app/models/pager_tree/integrations/new_relic/v3.rb +67 -0
  30. data/app/models/pager_tree/integrations/outgoing_event.rb +2 -0
  31. data/app/models/pager_tree/integrations/outgoing_webhook/v3.rb +37 -6
  32. data/app/models/pager_tree/integrations/outgoing_webhook_delivery/hook_relay.rb +8 -6
  33. data/app/models/pager_tree/integrations/outgoing_webhook_delivery.rb +1 -1
  34. data/app/models/pager_tree/integrations/pingdom/v3.rb +71 -0
  35. data/app/models/pager_tree/integrations/prometheus/v3.rb +79 -0
  36. data/app/models/pager_tree/integrations/prtg/v3.rb +58 -0
  37. data/app/models/pager_tree/integrations/server_guard24/v3.rb +74 -0
  38. data/app/models/pager_tree/integrations/site24x7/v3.rb +68 -0
  39. data/app/models/pager_tree/integrations/solar_winds/v3.rb +77 -0
  40. data/app/models/pager_tree/integrations/stackdriver/v3.rb +60 -0
  41. data/app/models/pager_tree/integrations/status_cake/v3.rb +65 -0
  42. data/app/models/pager_tree/integrations/twilio/incoming_sms/v3.rb +78 -0
  43. data/app/models/pager_tree/integrations/typeform/v3.rb +43 -0
  44. data/app/models/pager_tree/integrations/uptime/v3.rb +68 -0
  45. data/app/models/pager_tree/integrations/uptime_robot/v3.rb +79 -0
  46. data/app/models/pager_tree/integrations/webhook/v3.rb +112 -0
  47. data/app/models/pager_tree/integrations/zendesk/v3.rb +83 -0
  48. data/app/views/pager_tree/integrations/app_dynamics/v3/_form_options.html.erb +0 -0
  49. data/app/views/pager_tree/integrations/app_dynamics/v3/_show_options.html.erb +0 -0
  50. data/app/views/pager_tree/integrations/auvik/v3/_form_options.html.erb +0 -0
  51. data/app/views/pager_tree/integrations/auvik/v3/_show_options.html.erb +0 -0
  52. data/app/views/pager_tree/integrations/aws_cloudwatch/v3/_form_options.html.erb +0 -0
  53. data/app/views/pager_tree/integrations/aws_cloudwatch/v3/_show_options.html.erb +0 -0
  54. data/app/views/pager_tree/integrations/azure_monitor/v3/_form_options.html.erb +0 -0
  55. data/app/views/pager_tree/integrations/azure_monitor/v3/_show_options.html.erb +0 -0
  56. data/app/views/pager_tree/integrations/channel/hangouts/v3/_form_options.html.erb +34 -0
  57. data/app/views/pager_tree/integrations/channel/hangouts/v3/_show_options.html.erb +40 -0
  58. data/app/views/pager_tree/integrations/channel/mattermost/v3/_form_options.html.erb +1 -0
  59. data/app/views/pager_tree/integrations/channel/mattermost/v3/_show_options.html.erb +1 -0
  60. data/app/views/pager_tree/integrations/channel/microsoft_teams/v3/_form_options.html.erb +34 -0
  61. data/app/views/pager_tree/integrations/channel/microsoft_teams/v3/_show_options.html.erb +40 -0
  62. data/app/views/pager_tree/integrations/channel/slack/v3/_form_options.html.erb +34 -0
  63. data/app/views/pager_tree/integrations/channel/slack/v3/_show_options.html.erb +40 -0
  64. data/app/views/pager_tree/integrations/cronitor/v3/_form_options.html.erb +0 -0
  65. data/app/views/pager_tree/integrations/cronitor/v3/_show_options.html.erb +0 -0
  66. data/app/views/pager_tree/integrations/datadog/v3/_form_options.html.erb +0 -0
  67. data/app/views/pager_tree/integrations/datadog/v3/_show_options.html.erb +0 -0
  68. data/app/views/pager_tree/integrations/dead_mans_snitch/v3/_form_options.html.erb +0 -0
  69. data/app/views/pager_tree/integrations/dead_mans_snitch/v3/_show_options.html.erb +0 -0
  70. data/app/views/pager_tree/integrations/elast_alert/v3/_form_options.html.erb +0 -0
  71. data/app/views/pager_tree/integrations/elast_alert/v3/_show_options.html.erb +0 -0
  72. data/app/views/pager_tree/integrations/form/v3/_form_options.html.erb +64 -0
  73. data/app/views/pager_tree/integrations/form/v3/_show_options.html.erb +122 -0
  74. data/app/views/pager_tree/integrations/freshdesk/v3/_form_options.html.erb +0 -0
  75. data/app/views/pager_tree/integrations/freshdesk/v3/_show_options.html.erb +0 -0
  76. data/app/views/pager_tree/integrations/freshservice/v3/_form_options.html.erb +0 -0
  77. data/app/views/pager_tree/integrations/freshservice/v3/_show_options.html.erb +0 -0
  78. data/app/views/pager_tree/integrations/grafana/v3/_form_options.html.erb +0 -0
  79. data/app/views/pager_tree/integrations/grafana/v3/_show_options.html.erb +0 -0
  80. data/app/views/pager_tree/integrations/healthchecks/v3/_form_options.html.erb +0 -0
  81. data/app/views/pager_tree/integrations/healthchecks/v3/_show_options.html.erb +0 -0
  82. data/app/views/pager_tree/integrations/honeybadger/v3/_form_options.html.erb +7 -0
  83. data/app/views/pager_tree/integrations/honeybadger/v3/_show_options.html.erb +12 -0
  84. data/app/views/pager_tree/integrations/hyperping/v3/_form_options.html.erb +0 -0
  85. data/app/views/pager_tree/integrations/hyperping/v3/_show_options.html.erb +0 -0
  86. data/app/views/pager_tree/integrations/jira_server/v3/_form_options.html.erb +7 -0
  87. data/app/views/pager_tree/integrations/jira_server/v3/_show_options.html.erb +12 -0
  88. data/app/views/pager_tree/integrations/jotform/v3/_form_options.html.erb +0 -0
  89. data/app/views/pager_tree/integrations/jotform/v3/_show_options.html.erb +0 -0
  90. data/app/views/pager_tree/integrations/kapacitor/v3/_form_options.html.erb +0 -0
  91. data/app/views/pager_tree/integrations/kapacitor/v3/_show_options.html.erb +0 -0
  92. data/app/views/pager_tree/integrations/logic_monitor/v3/_form_options.html.erb +0 -0
  93. data/app/views/pager_tree/integrations/logic_monitor/v3/_show_options.html.erb +0 -0
  94. data/app/views/pager_tree/integrations/mattermost/outgoing_webhook/v3/_form_options.html.erb +7 -0
  95. data/app/views/pager_tree/integrations/mattermost/outgoing_webhook/v3/_show_options.html.erb +12 -0
  96. data/app/views/pager_tree/integrations/new_relic/v3/_form_options.html.erb +0 -0
  97. data/app/views/pager_tree/integrations/new_relic/v3/_show_options.html.erb +0 -0
  98. data/app/views/pager_tree/integrations/outgoing_webhook/v3/_form_options.html.erb +12 -4
  99. data/app/views/pager_tree/integrations/outgoing_webhook/v3/_show_options.html.erb +20 -2
  100. data/app/views/pager_tree/integrations/pingdom/v3/_form_options.html.erb +0 -0
  101. data/app/views/pager_tree/integrations/pingdom/v3/_show_options.html.erb +0 -0
  102. data/app/views/pager_tree/integrations/prometheus/v3/_form_options.html.erb +0 -0
  103. data/app/views/pager_tree/integrations/prometheus/v3/_show_options.html.erb +0 -0
  104. data/app/views/pager_tree/integrations/prtg/v3/_form_options.html.erb +0 -0
  105. data/app/views/pager_tree/integrations/prtg/v3/_show_options.html.erb +0 -0
  106. data/app/views/pager_tree/integrations/server_guard24/v3/_form_options.html.erb +7 -0
  107. data/app/views/pager_tree/integrations/server_guard24/v3/_show_options.html.erb +12 -0
  108. data/app/views/pager_tree/integrations/site24x7/v3/_form_options.html.erb +0 -0
  109. data/app/views/pager_tree/integrations/site24x7/v3/_show_options.html.erb +0 -0
  110. data/app/views/pager_tree/integrations/solar_winds/v3/_form_options.html.erb +0 -0
  111. data/app/views/pager_tree/integrations/solar_winds/v3/_show_options.html.erb +0 -0
  112. data/app/views/pager_tree/integrations/stackdriver/v3/_form_options.html.erb +0 -0
  113. data/app/views/pager_tree/integrations/stackdriver/v3/_show_options.html.erb +0 -0
  114. data/app/views/pager_tree/integrations/status_cake/v3/_form_options.html.erb +0 -0
  115. data/app/views/pager_tree/integrations/status_cake/v3/_show_options.html.erb +0 -0
  116. data/app/views/pager_tree/integrations/twilio/incoming_sms/v3/_form_options.html.erb +0 -0
  117. data/app/views/pager_tree/integrations/twilio/incoming_sms/v3/_show_options.html.erb +0 -0
  118. data/app/views/pager_tree/integrations/typeform/v3/_form_options.html.erb +0 -0
  119. data/app/views/pager_tree/integrations/typeform/v3/_show_options.html.erb +0 -0
  120. data/app/views/pager_tree/integrations/uptime/v3/_form_options.html.erb +0 -0
  121. data/app/views/pager_tree/integrations/uptime/v3/_show_options.html.erb +0 -0
  122. data/app/views/pager_tree/integrations/uptime_robot/v3/_form_options.html.erb +0 -0
  123. data/app/views/pager_tree/integrations/uptime_robot/v3/_show_options.html.erb +0 -0
  124. data/app/views/pager_tree/integrations/webhook/v3/_form_options.html.erb +15 -0
  125. data/app/views/pager_tree/integrations/webhook/v3/_show_options.html.erb +26 -0
  126. data/app/views/pager_tree/integrations/zendesk/v3/_form_options.html.erb +0 -0
  127. data/app/views/pager_tree/integrations/zendesk/v3/_show_options.html.erb +0 -0
  128. data/config/locales/en.yml +83 -23
  129. data/lib/generators/integration/integration_generator.rb +2 -1
  130. data/lib/generators/integration/templates/model.rb.tt +16 -6
  131. data/lib/pager_tree/integrations/version.rb +1 -1
  132. metadata +121 -3
@@ -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
@@ -0,0 +1,103 @@
1
+ module PagerTree::Integrations
2
+ class Freshservice::V3 < Integration
3
+ FS_TICKET_STATUS = {
4
+ open: 2,
5
+ pending: 3,
6
+ resolved: 4,
7
+ closed: 5
8
+ }
9
+
10
+ FS_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
+ _freshservice_webhook.dig("ticket_public_url")
37
+ end
38
+
39
+ def adapter_action
40
+ status = _freshservice_webhook.dig("ticket_status")
41
+ status_i = status&.to_i
42
+
43
+ if status_i == FS_TICKET_STATUS[:open] || status == "Open" || status_i == FS_TICKET_STATUS[:pending] || status == "Pending"
44
+ :create
45
+ elsif status_i == FS_TICKET_STATUS[:resolved] || status == "Resolved" || status_i == FS_TICKET_STATUS[:closed] || status == "Closed"
46
+ :resolve
47
+ else
48
+ :other
49
+ end
50
+ end
51
+
52
+ def adapter_process_create
53
+ Alert.new(
54
+ title: _title,
55
+ description: _description,
56
+ urgency: _urgency,
57
+ thirdparty_id: adapter_thirdparty_id,
58
+ dedup_keys: [adapter_thirdparty_id],
59
+ additional_data: _additional_datums
60
+ )
61
+ end
62
+
63
+ private
64
+
65
+ def _freshservice_webhook
66
+ # this is not a mistake, the webhook says fresh**desk**, not fresh**service**
67
+ adapter_incoming_request_params.dig("freshdesk_webhook")
68
+ end
69
+
70
+ def _title
71
+ _freshservice_webhook.dig("ticket_subject")
72
+ end
73
+
74
+ def _description
75
+ _freshservice_webhook.dig("ticket_description")
76
+ end
77
+
78
+ def _urgency
79
+ priority = _freshservice_webhook.dig("ticket_priority")
80
+ priority_i = priority&.to_i
81
+
82
+ if priority_i == FS_TICKET_PRIORITY[:low] || priority == "Low"
83
+ :low
84
+ elsif priority_i == FS_TICKET_PRIORITY[:medium] || priority == "Normal" || priority == "Medium"
85
+ :medium
86
+ elsif priority_i == FS_TICKET_PRIORITY[:high] || priority == "High"
87
+ :high
88
+ elsif priority_i == FS_TICKET_PRIORITY[:urgent] || priority == "Urgent"
89
+ :critical
90
+ end
91
+ end
92
+
93
+ def _additional_datums
94
+ [
95
+ AdditionalDatum.new(format: "text", label: "Ticket ID", value: _freshservice_webhook.dig("ticket_id")),
96
+ AdditionalDatum.new(format: "link", label: "Ticket URL", value: _freshservice_webhook.dig("ticket_url")),
97
+ AdditionalDatum.new(format: "text", label: "Requester Email", value: _freshservice_webhook.dig("ticket_email")),
98
+ AdditionalDatum.new(format: "text", label: "To Email", value: _freshservice_webhook.dig("ticket_to_email")),
99
+ AdditionalDatum.new(format: "text", label: "CC Email", value: _freshservice_webhook.dig("ticket_cc_email"))
100
+ ]
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,67 @@
1
+ module PagerTree::Integrations
2
+ class Grafana::V3 < Integration
3
+ OPTIONS = []
4
+ store_accessor :options, *OPTIONS.map { |x| x[:key] }.map(&:to_s), prefix: "option"
5
+
6
+ after_initialize do
7
+ end
8
+
9
+ def adapter_supports_incoming?
10
+ true
11
+ end
12
+
13
+ def adapter_supports_outgoing?
14
+ false
15
+ end
16
+
17
+ def adapter_incoming_can_defer?
18
+ true
19
+ end
20
+
21
+ def adapter_thirdparty_id
22
+ adapter_incoming_request_params.dig("ruleId")
23
+ end
24
+
25
+ def adapter_action
26
+ case _state
27
+ when "alerting"
28
+ :create
29
+ when "ok"
30
+ :resolve
31
+ else
32
+ :other
33
+ end
34
+ end
35
+
36
+ def adapter_process_create
37
+ Alert.new(
38
+ title: _title,
39
+ description: _description,
40
+ thirdparty_id: adapter_thirdparty_id,
41
+ dedup_keys: [adapter_thirdparty_id],
42
+ additional_data: _additional_datums
43
+ )
44
+ end
45
+
46
+ private
47
+
48
+ def _title
49
+ adapter_incoming_request_params.dig("ruleName")
50
+ end
51
+
52
+ def _description
53
+ adapter_incoming_request_params.dig("message")
54
+ end
55
+
56
+ def _state
57
+ adapter_incoming_request_params.dig("state")
58
+ end
59
+
60
+ def _additional_datums
61
+ [
62
+ AdditionalDatum.new(format: "link", label: "URL", value: adapter_incoming_request_params.dig("ruleURL")),
63
+ AdditionalDatum.new(format: "img", label: "Image", value: adapter_incoming_request_params.dig("imageUrl"))
64
+ ]
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,68 @@
1
+ module PagerTree::Integrations
2
+ class Healthchecks::V3 < Integration
3
+ OPTIONS = []
4
+ store_accessor :options, *OPTIONS.map { |x| x[:key] }.map(&:to_s), prefix: "option"
5
+
6
+ after_initialize do
7
+ end
8
+
9
+ def adapter_supports_incoming?
10
+ true
11
+ end
12
+
13
+ def adapter_supports_outgoing?
14
+ false
15
+ end
16
+
17
+ def adapter_incoming_can_defer?
18
+ true
19
+ end
20
+
21
+ def adapter_thirdparty_id
22
+ adapter_incoming_request_params.dig("incident_key")
23
+ end
24
+
25
+ def adapter_action
26
+ case adapter_incoming_request_params.dig("event_type")
27
+ when "trigger"
28
+ :create
29
+ when "resolve"
30
+ :resolve
31
+ else
32
+ :other
33
+ end
34
+ end
35
+
36
+ def adapter_process_create
37
+ Alert.new(
38
+ title: _title,
39
+ description: _description,
40
+ thirdparty_id: adapter_thirdparty_id,
41
+ dedup_keys: [adapter_thirdparty_id],
42
+ additional_data: _additional_datums,
43
+ tags: _tags
44
+ )
45
+ end
46
+
47
+ private
48
+
49
+ def _title
50
+ adapter_incoming_request_params.dig("title")
51
+ end
52
+
53
+ def _description
54
+ adapter_incoming_request_params.dig("description")
55
+ end
56
+
57
+ def _additional_datums
58
+ [
59
+ AdditionalDatum.new(format: "link", label: "Client URL", value: adapter_incoming_request_params.dig("client_url")),
60
+ AdditionalDatum.new(format: "text", label: "Client", value: adapter_incoming_request_params.dig("client"))
61
+ ]
62
+ end
63
+
64
+ def _tags
65
+ (adapter_incoming_request_params.dig("tags") || "").split(" ").map(&:strip).uniq.compact
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,76 @@
1
+ module PagerTree::Integrations
2
+ class Honeybadger::V3 < Integration
3
+ OPTIONS = [
4
+ # only used if they set this up as a "webhook" from honeybadger, the native PT integration doesn't have the token option
5
+ {key: :token, type: :string, default: nil}
6
+ ]
7
+ store_accessor :options, *OPTIONS.map { |x| x[:key] }.map(&:to_s), prefix: "option"
8
+
9
+ after_initialize do
10
+ self.option_token ||= nil
11
+ end
12
+
13
+ def adapter_should_block_incoming?(request)
14
+ self.option_token.present? && (request.headers["honeybadger-token"] != self.option_token)
15
+ end
16
+
17
+ def adapter_supports_incoming?
18
+ true
19
+ end
20
+
21
+ def adapter_supports_outgoing?
22
+ false
23
+ end
24
+
25
+ def adapter_incoming_can_defer?
26
+ true
27
+ end
28
+
29
+ def adapter_thirdparty_id
30
+ adapter_incoming_request_params.dig("fault", "url") || adapter_incoming_request_params.dig("outage", "details_url") || adapter_incoming_request_params.dig("check_in", "details_url")
31
+ end
32
+
33
+ def adapter_action
34
+ event = adapter_incoming_request_params.dig("event").to_s.downcase
35
+ case event
36
+ when "occurred", "down", "check_in_missing"
37
+ :create
38
+ when "resolved", "up", "check_in_reporting"
39
+ :resolve
40
+ else
41
+ :other
42
+ end
43
+ end
44
+
45
+ def adapter_process_create
46
+ Alert.new(
47
+ title: _title,
48
+ thirdparty_id: adapter_thirdparty_id,
49
+ dedup_keys: [adapter_thirdparty_id],
50
+ additional_data: _additional_datums,
51
+ tags: _tags
52
+ )
53
+ end
54
+
55
+ private
56
+
57
+ def _title
58
+ adapter_incoming_request_params.dig("message")
59
+ end
60
+
61
+ def _additional_datums
62
+ [
63
+ AdditionalDatum.new(format: "link", label: "Fault URL", value: adapter_incoming_request_params.dig("fault", "url")),
64
+ AdditionalDatum.new(format: "text", label: "Environment", value: adapter_incoming_request_params.dig("fault", "environment")),
65
+ AdditionalDatum.new(format: "link", label: "Outage URL", value: adapter_incoming_request_params.dig("outage", "details_url")),
66
+ AdditionalDatum.new(format: "link", label: "Check In URL", value: adapter_incoming_request_params.dig("check_in", "details_url"))
67
+ ]
68
+ end
69
+
70
+ def _tags
71
+ (
72
+ Array(adapter_incoming_request_params.dig("fault", "tags") || []) + Array(adapter_incoming_request_params.dig("fault", "environment"))
73
+ ).map(&:strip).uniq.compact
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,60 @@
1
+ module PagerTree::Integrations
2
+ class Hyperping::V3 < Integration
3
+ OPTIONS = []
4
+ store_accessor :options, *OPTIONS.map { |x| x[:key] }.map(&:to_s), prefix: "option"
5
+
6
+ after_initialize do
7
+ end
8
+
9
+ def adapter_supports_incoming?
10
+ true
11
+ end
12
+
13
+ def adapter_supports_outgoing?
14
+ false
15
+ end
16
+
17
+ def adapter_incoming_can_defer?
18
+ true
19
+ end
20
+
21
+ def adapter_thirdparty_id
22
+ adapter_incoming_request_params.dig("check", "url")
23
+ end
24
+
25
+ def adapter_action
26
+ event = adapter_incoming_request_params.dig("event")
27
+ case event
28
+ when "check.down"
29
+ :create
30
+ when "check.up"
31
+ :resolve
32
+ else
33
+ :other
34
+ end
35
+ end
36
+
37
+ def adapter_process_create
38
+ Alert.new(
39
+ title: _title,
40
+ thirdparty_id: adapter_thirdparty_id,
41
+ dedup_keys: [adapter_thirdparty_id],
42
+ additional_data: _additional_datums
43
+ )
44
+ end
45
+
46
+ private
47
+
48
+ def _title
49
+ adapter_incoming_request_params.dig("check", "url") + " is DOWN"
50
+ end
51
+
52
+ def _additional_datums
53
+ [
54
+ AdditionalDatum.new(format: "link", label: "URL", value: adapter_incoming_request_params.dig("check", "url")),
55
+ AdditionalDatum.new(format: "text", label: "Status Code", value: adapter_incoming_request_params.dig("check", "status")),
56
+ AdditionalDatum.new(format: "datetime", label: "Down Since", value: Time.at(adapter_incoming_request_params.dig("check", "date") / 1000).utc.to_datetime)
57
+ ]
58
+ end
59
+ end
60
+ end
@@ -1,5 +1,7 @@
1
1
  module PagerTree::Integrations
2
2
  class Integration < PagerTree::Integrations.integration_parent_class.constantize
3
+ extend PagerTree::Integrations::BooleanStoreAccessor
4
+
3
5
  serialize :options, JSON
4
6
  encrypts :options
5
7
 
@@ -13,10 +15,8 @@ module PagerTree::Integrations
13
15
 
14
16
  before_validation :cast_types
15
17
 
16
- attribute :option_title_template_enabled, :boolean, default: false
17
- attribute :option_description_template_enabled, :boolean, default: false
18
- attribute :option_title_template, :string, default: nil
19
- attribute :option_description_template, :string, default: nil
18
+ boolean_store_accessor :option_title_template_enabled
19
+ boolean_store_accessor :option_description_template_enabled
20
20
 
21
21
  # careful controller is not always guaranteed
22
22
  attribute :adapter_controller
@@ -34,6 +34,11 @@ module PagerTree::Integrations
34
34
  false
35
35
  end
36
36
 
37
+ # a function to determine if we should block the incoming request (e.g. if the payload doesn't match a signature)
38
+ def adapter_should_block_incoming?(request)
39
+ false
40
+ end
41
+
37
42
  # A unique identifier for this integration/alert
38
43
  def adapter_thirdparty_id
39
44
  ULID.generate
@@ -50,6 +55,9 @@ module PagerTree::Integrations
50
55
 
51
56
  def adapter_process_create
52
57
  end
58
+
59
+ def adapter_process_other
60
+ end
53
61
  # END basic incoming functions
54
62
 
55
63
  # START basic outgoing functions
@@ -65,6 +73,20 @@ module PagerTree::Integrations
65
73
  end
66
74
  # END basic outgoing functions
67
75
 
76
+ # START template functions
77
+ def adapter_supports_title_template?
78
+ true
79
+ end
80
+
81
+ def adapter_supports_description_template?
82
+ true
83
+ end
84
+ # END template functions
85
+
86
+ def adapter_supports_cnames?
87
+ false
88
+ end
89
+
68
90
  # START basic show functions
69
91
  def adapter_show_alerts?
70
92
  adapter_supports_incoming?
@@ -100,7 +122,7 @@ module PagerTree::Integrations
100
122
  end
101
123
 
102
124
  def adapter_response_blocked
103
- adapter_controller&.head(:bad_request)
125
+ adapter_controller&.head(:forbidden)
104
126
  end
105
127
 
106
128
  def adapter_response_deferred
@@ -0,0 +1,61 @@
1
+ module PagerTree::Integrations
2
+ class JiraServer::V3 < Integration
3
+ OPTIONS = [
4
+ {key: :issue_updated, type: :boolean, default: false}
5
+ ]
6
+ store_accessor :options, *OPTIONS.map { |x| x[:key] }.map(&:to_s), prefix: "option"
7
+
8
+ validates :option_issue_updated, inclusion: {in: [true, false]}
9
+
10
+ after_initialize do
11
+ self.option_issue_updated ||= false
12
+ end
13
+
14
+ def adapter_supports_incoming?
15
+ true
16
+ end
17
+
18
+ def adapter_supports_outgoing?
19
+ false
20
+ end
21
+
22
+ def adapter_incoming_can_defer?
23
+ true
24
+ end
25
+
26
+ def adapter_thirdparty_id
27
+ adapter_incoming_request_params.dig("issue", "id")
28
+ end
29
+
30
+ def adapter_action
31
+ event = adapter_incoming_request_params.dig("webhookEvent")
32
+ event == "jira:issue_created" || (self.option_issue_updated == true && event == "jira:issue_updated") ? :create : :other
33
+ end
34
+
35
+ def adapter_process_create
36
+ Alert.new(
37
+ title: _title,
38
+ description: _description,
39
+ thirdparty_id: adapter_thirdparty_id,
40
+ dedup_keys: [adapter_thirdparty_id],
41
+ additional_data: _additional_datums
42
+ )
43
+ end
44
+
45
+ private
46
+
47
+ def _title
48
+ adapter_incoming_request_params.dig("issue", "fields", "summary") || adapter_incoming_request_params.dig("issue", "key")
49
+ end
50
+
51
+ def _description
52
+ adapter_incoming_request_params.dig("issue", "fields", "description")
53
+ end
54
+
55
+ def _additional_datums
56
+ [
57
+ AdditionalDatum.new(format: "link", label: "Issue URL", value: adapter_incoming_request_params.dig("issue", "self"))
58
+ ]
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,50 @@
1
+ module PagerTree::Integrations
2
+ class Jotform::V3 < Integration
3
+ OPTIONS = []
4
+ store_accessor :options, *OPTIONS.map { |x| x[:key] }.map(&:to_s), prefix: "option"
5
+
6
+ after_initialize do
7
+ end
8
+
9
+ def adapter_supports_incoming?
10
+ true
11
+ end
12
+
13
+ def adapter_supports_outgoing?
14
+ false
15
+ end
16
+
17
+ def adapter_incoming_can_defer?
18
+ true
19
+ end
20
+
21
+ def adapter_thirdparty_id
22
+ adapter_incoming_request_params.dig("submissionID")
23
+ end
24
+
25
+ def adapter_action
26
+ :create
27
+ end
28
+
29
+ def adapter_process_create
30
+ Alert.new(
31
+ title: _title,
32
+ thirdparty_id: adapter_thirdparty_id,
33
+ dedup_keys: [adapter_thirdparty_id],
34
+ additional_data: _additional_datums
35
+ )
36
+ end
37
+
38
+ private
39
+
40
+ def _title
41
+ [adapter_incoming_request_params.dig("formTitle"), adapter_incoming_request_params.dig("submissionID")].join(" ")
42
+ end
43
+
44
+ def _additional_datums
45
+ [
46
+ AdditionalDatum.new(format: "link", label: "Submission URL", value: "https://www.jotform.com/submission/#{adapter_incoming_request_params.dig("submissionID")}")
47
+ ]
48
+ end
49
+ end
50
+ end