trigger_webhook_job.rb 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. class TriggerWebhookJob < ApplicationJob
  2. USER_ATTRIBUTE_BLACKLIST = %w[
  3. last_login
  4. login_failed
  5. password
  6. preferences
  7. group_ids
  8. groups
  9. authorization_ids
  10. authorizations
  11. ].freeze
  12. attr_reader :ticket, :trigger, :article
  13. retry_on TriggerWebhookJob::RequestError, attempts: 5, wait: lambda { |executions|
  14. executions * 10.seconds
  15. }
  16. discard_on(ActiveJob::DeserializationError) do |_job, e|
  17. Rails.logger.info 'Trigger, Ticket or Article may got removed before TriggerWebhookJob could be executed. Discarding job. See exception for further details.'
  18. Rails.logger.info e
  19. end
  20. def perform(trigger, ticket, article)
  21. @trigger = trigger
  22. @ticket = ticket
  23. @article = article
  24. return if request.success?
  25. raise TriggerWebhookJob::RequestError
  26. end
  27. private
  28. def request
  29. UserAgent.post(
  30. config['endpoint'],
  31. payload,
  32. {
  33. json: true,
  34. jsonParseDisable: true,
  35. open_timeout: 4,
  36. read_timeout: 30,
  37. total_timeout: 60,
  38. headers: headers,
  39. signature_token: config['token'],
  40. verify_ssl: verify_ssl?,
  41. log: {
  42. facility: 'webhook',
  43. },
  44. },
  45. )
  46. end
  47. def config
  48. @config ||= trigger.perform['notification.webhook']
  49. end
  50. def verify_ssl?
  51. config.fetch('verify_ssl', false).present?
  52. end
  53. def headers
  54. {
  55. 'X-Zammad-Trigger' => trigger.name,
  56. 'X-Zammad-Delivery' => job_id
  57. }
  58. end
  59. def payload
  60. {
  61. ticket: TriggerWebhookJob::RecordPayload.generate(ticket),
  62. article: TriggerWebhookJob::RecordPayload.generate(article),
  63. }
  64. end
  65. end