76 lines
1.6 KiB
Ruby
76 lines
1.6 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
module Alerting
|
||
|
class NotificationPayloadParser
|
||
|
BadPayloadError = Class.new(StandardError)
|
||
|
|
||
|
DEFAULT_TITLE = 'New: Incident'
|
||
|
|
||
|
def initialize(payload)
|
||
|
@payload = payload.to_h.with_indifferent_access
|
||
|
end
|
||
|
|
||
|
def self.call(payload)
|
||
|
new(payload).call
|
||
|
end
|
||
|
|
||
|
def call
|
||
|
{
|
||
|
'annotations' => annotations,
|
||
|
'startsAt' => starts_at
|
||
|
}.compact
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
attr_reader :payload
|
||
|
|
||
|
def title
|
||
|
payload[:title].presence || DEFAULT_TITLE
|
||
|
end
|
||
|
|
||
|
def annotations
|
||
|
primary_params
|
||
|
.reverse_merge(flatten_secondary_params)
|
||
|
.transform_values(&:presence)
|
||
|
.compact
|
||
|
end
|
||
|
|
||
|
def primary_params
|
||
|
{
|
||
|
'title' => title,
|
||
|
'description' => payload[:description],
|
||
|
'monitoring_tool' => payload[:monitoring_tool],
|
||
|
'service' => payload[:service],
|
||
|
'hosts' => hosts.presence
|
||
|
}
|
||
|
end
|
||
|
|
||
|
def hosts
|
||
|
Array(payload[:hosts]).reject(&:blank?)
|
||
|
end
|
||
|
|
||
|
def current_time
|
||
|
Time.current.change(usec: 0).rfc3339
|
||
|
end
|
||
|
|
||
|
def starts_at
|
||
|
Time.parse(payload[:start_time].to_s).rfc3339
|
||
|
rescue ArgumentError
|
||
|
current_time
|
||
|
end
|
||
|
|
||
|
def secondary_params
|
||
|
payload.except(:start_time)
|
||
|
end
|
||
|
|
||
|
def flatten_secondary_params
|
||
|
Gitlab::Utils::SafeInlineHash.merge_keys!(secondary_params)
|
||
|
rescue ArgumentError
|
||
|
raise BadPayloadError, 'The payload is too big'
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|