123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- 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
|