app/listeners/webhook_listener.rb
class WebhookListener < BaseListener
def conversation_status_changed(event)
conversation = extract_conversation_and_account(event)[0]
changed_attributes = extract_changed_attributes(event)
inbox = conversation.inbox
payload = conversation.webhook_data.merge(event: __method__.to_s, changed_attributes: changed_attributes)
deliver_webhook_payloads(payload, inbox)
end
def conversation_updated(event)
conversation = extract_conversation_and_account(event)[0]
changed_attributes = extract_changed_attributes(event)
inbox = conversation.inbox
payload = conversation.webhook_data.merge(event: __method__.to_s, changed_attributes: changed_attributes)
deliver_webhook_payloads(payload, inbox)
end
def conversation_created(event)
conversation = extract_conversation_and_account(event)[0]
inbox = conversation.inbox
payload = conversation.webhook_data.merge(event: __method__.to_s)
deliver_webhook_payloads(payload, inbox)
end
def message_created(event)
message = extract_message_and_account(event)[0]
inbox = message.inbox
return unless message.webhook_sendable?
payload = message.webhook_data.merge(event: __method__.to_s)
deliver_webhook_payloads(payload, inbox)
end
def message_updated(event)
message = extract_message_and_account(event)[0]
inbox = message.inbox
return unless message.webhook_sendable?
payload = message.webhook_data.merge(event: __method__.to_s)
deliver_webhook_payloads(payload, inbox)
end
def webwidget_triggered(event)
contact_inbox = event.data[:contact_inbox]
inbox = contact_inbox.inbox
payload = contact_inbox.webhook_data.merge(event: __method__.to_s)
payload[:event_info] = event.data[:event_info]
deliver_webhook_payloads(payload, inbox)
end
def contact_created(event)
contact, account = extract_contact_and_account(event)
payload = contact.webhook_data.merge(event: __method__.to_s)
deliver_account_webhooks(payload, account)
end
def contact_updated(event)
contact, account = extract_contact_and_account(event)
changed_attributes = extract_changed_attributes(event)
return if changed_attributes.blank?
payload = contact.webhook_data.merge(event: __method__.to_s, changed_attributes: changed_attributes)
deliver_account_webhooks(payload, account)
end
def inbox_created(event)
inbox, account = extract_inbox_and_account(event)
inbox_webhook_data = Inbox::EventDataPresenter.new(inbox).push_data
payload = inbox_webhook_data.merge(event: __method__.to_s)
deliver_account_webhooks(payload, account)
end
def inbox_updated(event)
inbox, account = extract_inbox_and_account(event)
changed_attributes = extract_changed_attributes(event)
return if changed_attributes.blank?
inbox_webhook_data = Inbox::EventDataPresenter.new(inbox).push_data
payload = inbox_webhook_data.merge(event: __method__.to_s, changed_attributes: changed_attributes)
deliver_account_webhooks(payload, account)
end
private
def deliver_account_webhooks(payload, account)
account.webhooks.account_type.each do |webhook|
next unless webhook.subscriptions.include?(payload[:event])
WebhookJob.perform_later(webhook.url, payload)
end
end
def deliver_api_inbox_webhooks(payload, inbox)
return unless inbox.channel_type == 'Channel::Api'
return if inbox.channel.webhook_url.blank?
WebhookJob.perform_later(inbox.channel.webhook_url, payload, :api_inbox_webhook)
end
def deliver_webhook_payloads(payload, inbox)
deliver_account_webhooks(payload, inbox.account)
deliver_api_inbox_webhooks(payload, inbox)
end
end