class Xip::Services::Facebook::Client

Constants

FB_ENDPOINT

Attributes

api_endpoint[R]
reply[R]

Public Class Methods

fetch_profile(recipient_id:, fields: nil) click to toggle source
# File lib/xip/services/facebook/client.rb, line 59
def self.fetch_profile(recipient_id:, fields: nil)
  if fields.blank?
    fields = [:id, :name, :first_name, :last_name, :profile_pic]
  end

  query_hash = {
    fields: fields.join(','),
    access_token: Xip.config.facebook.page_access_token
  }

  uri = URI::HTTPS.build(
    host: "graph.facebook.com",
    path: "/#{recipient_id}",
    query: query_hash.to_query
  )

  res = http_client.get(uri.to_s)
  Xip::Logger.l(topic:
    'facebook',
    message: "Requested user profile for #{recipient_id}. Response: #{res.status.code}: #{res.body}"
  )

  if res.status.success?
    MultiJson.load(res.body.to_s)
  else
    raise(
      Xip::Errors::ServiceError,
      "Facebook error #{res.status}: #{res.body}"
    )
  end
end
http_client() click to toggle source
# File lib/xip/services/facebook/client.rb, line 52
def self.http_client
  headers = {
    'Content-Type' => 'application/json'
  }
  HTTP.timeout(connect: 15, read: 60).headers(headers)
end
new(reply:, endpoint: 'messages') click to toggle source
# File lib/xip/services/facebook/client.rb, line 22
def initialize(reply:, endpoint: 'messages')
  @reply = reply
  access_token = "access_token=#{Xip.config.facebook.page_access_token}"
  @api_endpoint = [[FB_ENDPOINT, endpoint].join('/'), access_token].join('?')
end
track(recipient_id:, metric:, value:, options: {}) click to toggle source
# File lib/xip/services/facebook/client.rb, line 91
def self.track(recipient_id:, metric:, value:, options: {})
  metric_values = [{
    '_eventName' => metric,
    '_valueToSum' => value
  }]

  metric_values.first.merge!(options)

  params = {
    event: 'CUSTOM_APP_EVENTS',
    custom_events: MultiJson.dump(metric_values),
    advertiser_tracking_enabled: 1,
    application_tracking_enabled: 1,
    extinfo: MultiJson.dump(['mb1']),
    page_scoped_user_id: recipient_id,
    page_id: Xip.config.facebook.page_id
  }

  uri = URI::HTTPS.build(
    host: "graph.facebook.com",
    path: "/#{Xip.config.facebook.app_id}/activities"
  )

  res = http_client.post(uri.to_s, body: MultiJson.dump(params))
  Xip::Logger.l(
    topic: "facebook",
    message: "Sent custom event for metric: #{metric} and value: #{value}. Response: #{res.status}: #{res.body}"
  )

  if res.status.success?
    MultiJson.load(res.body.to_s)
  else
    raise(
      Xip::Errors::ServiceError,
      "Facebook error #{res.status}: #{res.body}"
    )
  end
end

Public Instance Methods

transmit() click to toggle source
# File lib/xip/services/facebook/client.rb, line 28
def transmit
  res = self
          .class
          .http_client
          .post(api_endpoint, body: MultiJson.dump(reply))

  if res.status.client_error? # HTTP 4xx error
    # Messenger error sub-codes (https://developers.facebook.com/docs/messenger-platform/reference/send-api/error-codes)
    case res.body
    when /1545041/
      raise Xip::Errors::UserOptOut
    when /2018108/
      raise Xip::Errors::UserOptOut
    when /2018028/
      raise Xip::Errors::InvalidSessionID.new('Cannot message users who are not admins, developers or testers of the app until pages_messaging permission is reviewed and the app is live.')
    end
  end

  Xip::Logger.l(
    topic: "facebook",
    message: "Transmitted. Response: #{res.status.code}: #{res.body}"
  )
end