class TriggerWebhookJob < ApplicationJob USER_ATTRIBUTE_BLACKLIST = %w[ last_login login_failed password preferences group_ids groups authorization_ids authorizations ].freeze attr_reader :ticket, :trigger, :article retry_on TriggerWebhookJob::RequestError, attempts: 5, wait: lambda { |executions| executions * 10.seconds } discard_on(ActiveJob::DeserializationError) do |_job, e| Rails.logger.info 'Trigger, Ticket or Article may got removed before TriggerWebhookJob could be executed. Discarding job. See exception for further details.' Rails.logger.info e end def perform(trigger, ticket, article) @trigger = trigger @ticket = ticket @article = article return if request.success? raise TriggerWebhookJob::RequestError end private def request UserAgent.post( config['endpoint'], payload, { json: true, jsonParseDisable: true, open_timeout: 4, read_timeout: 30, total_timeout: 60, headers: headers, signature_token: config['token'], verify_ssl: verify_ssl?, log: { facility: 'webhook', }, }, ) end def config @config ||= trigger.perform['notification.webhook'] end def verify_ssl? config.fetch('verify_ssl', false).present? end def headers { 'X-Zammad-Trigger' => trigger.name, 'X-Zammad-Delivery' => job_id } end def payload { ticket: TriggerWebhookJob::RecordPayload.generate(ticket), article: TriggerWebhookJob::RecordPayload.generate(article), } end end