Module: PlataformaSocial::Facebook

Included in:
ActionController::Base
Defined in:
lib/plataforma_social/facebook.rb

Instance Method Summary collapse

Instance Method Details

#facebook_loginObject



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/plataforma_social/facebook.rb', line 6

def 
  load_oauth
  load_graph

  redirect = false

  if params[:code]
    begin
      @oauth.get_access_token(params[:code])
    rescue Koala::Facebook::OAuthTokenRequestError
      redirect = true if parse_facebook_signed_request && !parse_facebook_signed_request['oauth_token']
    end
  else
    redirect = true if parse_facebook_signed_request && !parse_facebook_signed_request['oauth_token']
  end

  if parse_facebook_signed_request && parse_facebook_signed_request['oauth_token']
    if parse_facebook_signed_request['expires'] > Time.now.to_i # Se o access_token do usuário não estiver expirado
      if !session[:not_verify_facebook_permissions] == true
        begin
          permissions = @graph.get_object('me', :fields => 'permissions')['permissions']['data'][0]
          session[:not_verify_facebook_permissions] = true

          PlataformaSocial.facebook_scope.split(',').each do |permission|
            redirect = true unless permissions[permission.strip]
          end
        rescue Koala::Facebook::AuthenticationError
          redirect = true

          # Remove o signed_request da URL já que ele está expirado e recarrega o objeto do @oauth
          if params[:callback_url].present?
            params[:callback_url].gsub!("signed_request=#{params[:signed_request]}", "")
          elsif request.present?
            request.fullpath.gsub!("signed_request=#{params[:signed_request]}", "")
          else
            PlataformaSocial.facebook_callback_url.to_s.gsub!("signed_request=#{params[:signed_request]}", "")
          end

          load_oauth
        end
      end
    else
      redirect = true
    end
  end

  if redirect
    render :text => %|<script type="text/javascript">window.top.location.href="#{@oauth.url_for_oauth_code(:permissions => PlataformaSocial.configuration.facebook_scope)}";</script>|
  end
end

#facebook_user_dataObject



99
100
101
102
103
# File 'lib/plataforma_social/facebook.rb', line 99

def facebook_user_data
  if load_graph
    @graph.get_object('me')
  end
end

#load_graphObject



141
142
143
# File 'lib/plataforma_social/facebook.rb', line 141

def load_graph
  @graph = Koala::Facebook::API.new parse_facebook_signed_request['oauth_token'] if parse_facebook_signed_request.present? && parse_facebook_signed_request['oauth_token']
end

#load_oauthObject



110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/plataforma_social/facebook.rb', line 110

def load_oauth
  if params[:callback_url].present?
    callback_url = params[:callback_url]
  elsif request.present?
    callback_url = "#{request.protocol}#{request.host_with_port}#{request.fullpath}"
  else
    callback_url = PlataformaSocial.facebook_callback_url.to_s
  end

  uri = URI.parse(callback_url)

  callback_url = if uri && uri.scheme.present?
    uri.query = [
      uri.query,
      "gm_referral_code=#{URI.encode(params[:gm_referral_code] || '')}",
      "utm_source=#{URI.encode(params[:utm_source] || '')}",
      "source=#{URI.encode(params[:utm_source] || '')}",
      "campaign=#{URI.encode(params[:utm_campaign] || '')}",
      "utm_campaign=#{URI.encode(params[:utm_campaign] || '')}",
      "medium=#{URI.encode(params[:utm_medium] || '')}",
      "utm_medium=#{URI.encode(params[:utm_medium] || '')}"
    ].compact.join('&')

    uri.to_s
  else
    nil
  end

  @oauth = Koala::Facebook::OAuth.new(PlataformaSocial.facebook_app_id, PlataformaSocial.facebook_app_secret, callback_url)
end

#load_user_data(options = {}) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/plataforma_social/facebook.rb', line 57

def load_user_data options = {}
  settings = {
    referral_code: params[:gm_referral_code],
    source: params[:utm_source],
    utm: {
      source: params[:utm_source],
      medium: params[:utm_medium],
      campaign: params[:utm_campaign]
    },
    referrer: request.referer,
    signed_request: params[:signed_request]
  }.merge options

  facebook_data          = facebook_user_data.try(:symbolize_keys)
  plataforma_social_data = plataforma_social_user_data(settings).try(:symbolize_keys)

  @user_data = { :facebook => facebook_data, :plataforma_social => plataforma_social_data }
end

#parse_facebook_signed_requestObject



105
106
107
108
# File 'lib/plataforma_social/facebook.rb', line 105

def parse_facebook_signed_request
  load_oauth
  @oauth.parse_signed_request params[:signed_request] if params[:signed_request].present?
end

#plataforma_social_user_data(options = {}) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/plataforma_social/facebook.rb', line 76

def plataforma_social_user_data options = {}
  settings = {
    referral_code: params[:gm_referral_code],
    source: params[:utm_source],
    utm: {
      source: params[:utm_source],
      medium: params[:utm_medium],
      campaign: params[:utm_campaign]
    },
    referrer: request.referer,
    signed_request: params[:signed_request]
  }.merge options

  if settings[:signed_request]
    response = Request.post("#{PlataformaSocial.domains('login')}/register", settings)

    data = {}
    data[:reference] = response['id'] if response.present? && response['id']

    data
  end
end