Class: Webhook

Inherits:
ApplicationRecord
  • Object
show all
Extended by:
FriendlyId
Includes:
Authorizable, Encryptable, Parameterizable::ByIdName
Defined in:
app/models/webhook.rb

Constant Summary collapse

EVENT_POSTFIX =
".#{Foreman::Observable::DEFAULT_NAMESPACE}"
EVENT_ALLOWLIST =
%w[
  host_created host_updated host_destroyed
  hostgroup_created hostgroup_updated hostgroup_destroyed
  user_created user_updated user_destroyed
  domain_created domain_updated domain_destroyed
  subnet_created subnet_updated subnet_destroyed
  build_entered build_exited status_changed
].map { |e| e + EVENT_POSTFIX }.freeze
DEFAULT_PAYLOAD_TEMPLATE =
'Webhook Template - Payload Default'
ALLOWED_HTTP_METHODS =
%w[POST GET PUT DELETE PATCH].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.available_eventsObject



49
50
51
# File 'app/models/webhook.rb', line 49

def self.available_events
  ::Foreman::EventSubscribers.all_observable_events & EVENT_ALLOWLIST
end

.deliver(event_name:, payload:) ⇒ Object



53
54
55
56
57
# File 'app/models/webhook.rb', line 53

def self.deliver(event_name:, payload:)
  for_event(event_name).includes([:webhook_template]).each do |target|
    target.deliver(event_name: event_name, payload: payload) if target.enabled?
  end
end

Instance Method Details

#ca_certs_storeObject



89
90
91
92
93
94
95
96
97
98
99
# File 'app/models/webhook.rb', line 89

def ca_certs_store
  store = OpenSSL::X509::Store.new
  return store if ssl_ca_certs.blank?

  ssl_ca_certs.split(/(?=-----BEGIN)/).each do |cert|
    store.add_cert(OpenSSL::X509::Certificate.new(cert))
  end
  store
rescue StandardError => e
  raise _(format('Failed to build X509 certificate store for HTTPS client, error: %s', e.message))
end

#deliver(event_name:, payload:) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
# File 'app/models/webhook.rb', line 76

def deliver(event_name:, payload:)
  payload_to_deliver = rendered_payload(event_name, payload)
  headers_to_deliver = rendered_headers(event_name, payload)
  url_to_deliver = rendered_targed_url(event_name, payload)
  ::ForemanWebhooks::DeliverWebhookJob.perform_later(
    event_name: event_name,
    payload: payload_to_deliver,
    headers: headers_to_deliver,
    url: url_to_deliver,
    webhook_id: id
  )
end

#eventObject



72
73
74
# File 'app/models/webhook.rb', line 72

def event
  events.first
end

#event=(event) ⇒ Object



68
69
70
# File 'app/models/webhook.rb', line 68

def event=(event)
  self.events = event
end

#events=(events) ⇒ Object



59
60
61
62
63
64
65
66
# File 'app/models/webhook.rb', line 59

def events=(events)
  events = Array(events).map do |event|
    next event if event.end_with?(EVENT_POSTFIX)

    event.to_s.underscore + EVENT_POSTFIX
  end
  super(self.class.available_events & events)
end