class Xip::Services::Facebook::MessageHandler

Attributes

facebook_message[R]
headers[R]
params[R]
service_message[R]

Public Class Methods

new(params:, headers:) click to toggle source
# File lib/xip/services/facebook/message_handler.rb, line 16
def initialize(params:, headers:)
  @params = params
  @headers = headers
end

Public Instance Methods

coordinate() click to toggle source
# File lib/xip/services/facebook/message_handler.rb, line 21
def coordinate
  if facebook_is_validating_webhook?
    respond_with_validation
  else
    # Queue the request processing so we can respond quickly to FB
    # and also keep track of this message
    Xip::Services::HandleMessageJob.perform_async(
      'facebook',
      params,
      headers
    )

    # Relay our acceptance
    [200, 'OK']
  end
end
process() click to toggle source
# File lib/xip/services/facebook/message_handler.rb, line 38
def process
  @service_message = ServiceMessage.new(service: 'facebook')
  @facebook_message = params['entry'].first['messaging'].first
  service_message.sender_id = get_sender_id
  service_message.target_id = get_target_id
  service_message.timestamp = get_timestamp
  process_facebook_event

  service_message
end

Private Instance Methods

facebook_is_validating_webhook?() click to toggle source
# File lib/xip/services/facebook/message_handler.rb, line 51
def facebook_is_validating_webhook?
  params['hub.verify_token'].present?
end
get_sender_id() click to toggle source
# File lib/xip/services/facebook/message_handler.rb, line 63
def get_sender_id
  facebook_message['sender']['id']
end
get_target_id() click to toggle source
# File lib/xip/services/facebook/message_handler.rb, line 67
def get_target_id
  facebook_message['recipient']['id']
end
get_timestamp() click to toggle source
# File lib/xip/services/facebook/message_handler.rb, line 71
def get_timestamp
  Time.at(facebook_message['timestamp']/1000).to_datetime
end
process_facebook_event() click to toggle source
# File lib/xip/services/facebook/message_handler.rb, line 75
def process_facebook_event
  if facebook_message['message'].present?
    message_event = Xip::Services::Facebook::MessageEvent.new(
      service_message: service_message,
      params: facebook_message
    )
  elsif facebook_message['postback'].present?
    message_event = Xip::Services::Facebook::PostbackEvent.new(
      service_message: service_message,
      params: facebook_message
    )
  elsif facebook_message['read'].present?
    message_event = Xip::Services::Facebook::MessageReadsEvent.new(
      service_message: service_message,
      params: facebook_message
    )
  elsif facebook_message['referral'].present?
    message_event = Xip::Services::Facebook::MessagingReferralEvent.new(
      service_message: service_message,
      params: facebook_message
    )
  end

  message_event.process
end
respond_with_validation() click to toggle source
# File lib/xip/services/facebook/message_handler.rb, line 55
def respond_with_validation
  if params['hub.verify_token'] == Xip.config.facebook.verify_token
    [200, params['hub.challenge']]
  else
    [401, "Verify token did not match environment variable."]
  end
end