# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
class TriggerWebhookJob::CustomPayload::Track::Notification < TriggerWebhookJob::CustomPayload::Track
class << self
def root?
true
end
def klass
'Struct::Notification'
end
def functions
%w[
subject
link
message
body
changes
].freeze
end
def replacements(pre_defined_webhook_type:)
{
notification: functions,
}
end
Struct.new('Notification', :subject, :message, :link, :changes, :body) if !defined?(Struct::Notification)
def generate(tracks, data)
return if data[:event].blank?
event = data[:event]
raise ArgumentError, __("The required event field 'execution' is missing.") if event.exclude?(:execution)
type = type!(event)
template = fetch(tracks, event, type)
tracks[:notification] = assemble(template, has_body: tracks[:article].present? && tracks[:article].body_as_text.strip.present?, type:)
end
private
def fetch(tracks, event, type)
NotificationFactory::Messaging.template(
template: "ticket_#{type}",
locale: Setting.get('locale_default') || 'en-us',
timezone: Setting.get('timezone_default'),
objects: {
ticket: tracks.fetch(:ticket, nil),
article: tracks.fetch(:article, nil),
current_user: event[:user_id].present? ? ::User.lookup(id: event[:user_id]) : nil,
changes: event[:changes],
},
)
end
def type!(event)
return 'info' if event[:execution].eql?('job')
return event[:type] if event[:execution].eql?('trigger')
raise ArgumentError, __("The required event field 'execution' is unknown or missing.")
end
def assemble(template, has_body: false, type: nil)
match = regex(has_body).match(template[:body])
raise ArgumentError, "Extracting information for the notification failed due to a non-matching template (template: #{"ticket_#{type}"}, locale: #{Setting.get('locale_default')})." if match.nil?
notification = {
subject: template[:subject][2..],
message: match[:message].presence || '',
link: match[:link].presence || '',
changes: match[:changes].presence || '',
body: has_body ? match[:body].presence || '' : '',
}
sanitize(notification)
Struct::Notification.new(*notification.values)
end
def regex(extended)
source = '_<(?.+)\|.+>[ ]?:(?.+)_(\n(?.+))?'
source += '\n{3,4}(?.+)?' if extended
Regexp.new(source, Regexp::MULTILINE)
end
def sanitize(hash)
hash.each do |key, value|
if key.eql?(:changes)
value = value
.split(%r{\n})
.map(&:strip)
.compact_blank
.join('\n')
end
hash[key] = value.strip
end
end
end
end