Skip to content

Commit

Permalink
First pass on extracting facebook ENV and Global vars into an
Browse files Browse the repository at this point in the history
Adapter class.

BeboAdapter seesm to be working.  Need to create some tests.
  • Loading branch information
David Clements committed Jul 7, 2008
1 parent 3b5c687 commit da5b78a
Show file tree
Hide file tree
Showing 9 changed files with 230 additions and 14 deletions.
2 changes: 2 additions & 0 deletions init.rb
Expand Up @@ -19,6 +19,8 @@
require 'facebooker/rails/facebook_request_fix'
require 'facebooker/rails/routing'
require 'facebooker/rails/facebook_pretty_errors' rescue nil
require 'facebooker/adapters/facebook_adapter'
require 'facebooker/adapters/bebo_adapter'
module ::ActionController
class Base
def self.inherited_with_facebooker(subclass)
Expand Down
37 changes: 34 additions & 3 deletions lib/facebooker.rb
Expand Up @@ -33,24 +33,55 @@

module Facebooker
class << self
def current_adapter=(adapter_class)
@current_adapter = adapter_class
end

def current_adapter
@current_adapter
end

def path_prefix
@path_prefix
end

def facebook_path_prefix=(path)
@facebook_path_prefix = path
current_adapter.facebook_path_prefix = path
end

# Default is canvas_page_name in yml file
def facebook_path_prefix
"/" + (@facebook_path_prefix || ENV["FACEBOOK_CANVAS_PATH"] || ENV["FACEBOOKER_RELATIVE_URL_ROOT"])
current_adapter.facebook_path_prefix
end

# Default is apps.facebook.com
def canvas_server_base
current_adapter.canvas_server_base
end

def api_server_base_url
current_adapter.api_server_base_url
end

def api_server_base
current_adapter.api_server_base
end


[:api_key,:secret_key, :www_server_base_url,:login_url_base,:api_rest_path].each do |delegated_method|
define_method(delegated_method){ return current_adapter.send(delegated_method)}
end





# Set the asset path to the canvas path for just this one request
# by definition, we will make this a canvas request
def with_asset_path_for_canvas
original_asset_host = ActionController::Base.asset_host
begin
ActionController::Base.asset_host = ENV["FACEBOOKER_API"] == "new" ? "http://apps.new.facebook.com" : "http://apps.facebook.com"
ActionController::Base.asset_host = Facebooker.api_server_base_url
request_for_canvas(true) do
yield
end
Expand Down
41 changes: 41 additions & 0 deletions lib/facebooker/adapters/bebo_adapter.rb
@@ -0,0 +1,41 @@

# Things that don't actually work in BEBO

Facebooker::PublishTemplatizedAction
module Facebooker
class User
def set_profile_fbml_with_bebo_adapter(profile_fbml, mobile_fbml, profile_action_fbml)
if(Facebooker::BeboSession === self.session )
self.session.post('facebook.profile.setFBML', :uid => @id, :markup => profile_fbml)
else
set_profile_fbml_without_bebo_adapter(profile_fbml,mobile_fbml, profile_action_fbml)
end
end
alias_method_chain :set_profile_fbml, :bebo_adapter

private

BEBO_FIELDS = FIELDS - [:meeting_sex, :wall_count, :meeting_for]
def collect(fields)
if(Facebooker::BeboSession === self.session )
BEBO_FIELDS.reject{|field_name| !fields.empty? && !fields.include?(field_name)}.join(',')
else
FIELDS.reject{|field_name| !fields.empty? && !fields.include?(field_name)}.join(',')
end
end
end


class PublishTemplatizedAction < Parser#:nodoc:
class <<self
def process_with_bebo_adapter(data)
if(Facebooker.is_for?(:bebo))
element('feed_publishTemplatizedAction_response', data).text_value
else
process_without_bebo_adapter(data)
end
end
alias_method_chain :process, :bebo_adapter
end
end
end
124 changes: 124 additions & 0 deletions lib/facebooker/adapters/facebook_adapter.rb
@@ -0,0 +1,124 @@
module Facebooker
class AdapterBase
class << self
def facebook_path_prefix
"/" + (@facebook_path_prefix || canvas_page_name)
end

def facebook_path_prefix=(prefix)
@facebook_path_prefix = prefix
end

def facebooker_config
return @facebooker_config if @facebooker_config

facebook_config_file = "#{RAILS_ROOT}/config/facebooker.yml"
if File.exist?(facebook_config_file)
@facebooker_config = YAML.load_file(facebook_config_file)[RAILS_ENV]
end
end

def api_server_base_url
"http://" + api_server_base
end

def is_for?(application_context)
raise "SubClassShouldDefine"
end


end

end
class FacebookAdapter < AdapterBase
class << self
def canvas_page_name
facebooker_config["canvas_page_name"]
end
def api_key
facebooker_config["api_key"]
end

def secret_key
facebooker_config["secret_key"]
end

def canvas_server_base
"apps.facebook.com"
end

def api_server_base
ENV["FACEBOOKER_API"] == "new" ? "api.new.facebook.com" : "api.facebook.com"
end

def api_rest_path
"/restserver.php"
end

def is_for?(application_context)
application_context == :facebook
end

def www_server_base_url
ENV["FACEBOOKER_API"] == "new" ? "www.new.facebook.com" : "www.facebook.com"
end

def login_url_base(api_key)
"http://#{Facebooker.www_server_base_url}/login.php?api_key=#{api_key}&v=1.0"
end

def install_url_base(api_key)
"http://#{Facebooker.www_server_base_url}/install.php?api_key=#{api_key}&v=1.0"
end

end
end
end


module Facebooker
class BeboAdapter < AdapterBase
class << self
def canvas_page_name
facebooker_config["bebo_canvas_page_name"]
end
def canvas_server_base
"apps.bebo.com"
end

def api_key
facebooker_config["bebo_api_key"]
end

def secret_key
facebooker_config["bebo_secret_key"]
end

def api_server_base
'apps.bebo.com'
end

def api_rest_path
"/restserver.php"
end

def is_for?(application_context)
application_context == :bebo
end

def www_server_base_url
"www.bebo.com"
end


def login_url_base(api_key)
options = default_login_url_options.merge(options)
"http://#{Facebooker.www_server_base_url}/SignIn.jsp?ApiKey=#{api_key}&v=1.0"
end

def install_url_base(api_key)
"http://#{Facebooker.www_server_base_url}/c/apps/add?ApiKey=#{api_key}&v=1.0"
end
end
end
end
22 changes: 19 additions & 3 deletions lib/facebooker/rails/controller.rb
Expand Up @@ -4,11 +4,27 @@ module Rails
module Controller
def self.included(controller)
controller.extend(ClassMethods)
controller.before_filter :set_adapter
controller.before_filter :set_fbml_format
controller.helper_attr :facebook_session_parameters

end


def set_adapter
if( fb_sig_network == :bebo)
Facebooker.current_adapter = Facebooker::BeboAdapter
else
Facebooker.current_adapter = Facebooker::FacebookAdapter
end
end

def fb_sig_network
if ( network = params[:fb_sig_network] )
network.downcase.to_sym
else
:facebook
end
end

def facebook_session
@facebook_session
end
Expand Down Expand Up @@ -64,7 +80,7 @@ def create_new_facebook_session_and_redirect!
end

def new_facebook_session
Facebooker::Session.create(Facebooker::Session.api_key, Facebooker::Session.secret_key)
Facebooker::Session.create(Facebooker.api_key, Facebooker.secret_key)
end

def capture_facebook_friends_if_available!
Expand Down
2 changes: 1 addition & 1 deletion lib/facebooker/rails/facebook_url_rewriting.rb
Expand Up @@ -18,7 +18,7 @@ def rewrite_url_with_facebooker(*args)
options = args.first.is_a?(Hash) ? args.first : args.last
is_link_to_canvas = link_to_canvas?(@request.request_parameters, options)
if is_link_to_canvas && !options.has_key?(:host)
options[:host] = "apps.facebook.com"
options[:host] = Facebooker.canvas_server_base
end
options.delete(:canvas)
Facebooker.request_for_canvas(is_link_to_canvas) do
Expand Down
2 changes: 1 addition & 1 deletion lib/facebooker/rails/helpers.rb
Expand Up @@ -516,7 +516,7 @@ def fb_else
#
# Return the URL for the about page of the application
def fb_about_url
"http://www.facebook.com/apps/application.php?api_key=#{ENV["FACEBOOK_API_KEY"]}"
"http://www.facebook.com/apps/application.php?api_key=#{Facebooker.api_key}"
end

#
Expand Down
2 changes: 1 addition & 1 deletion lib/facebooker/rails/publisher.rb
Expand Up @@ -261,7 +261,7 @@ def method_missing(name,*args)
end

def default_url_options
{:host => "apps.facebook.com" + Facebooker.facebook_path_prefix}
{:host => Facebooker.api_server_base_url + Facebooker.facebook_path_prefix}
end

def controller_path
Expand Down
12 changes: 7 additions & 5 deletions lib/facebooker/session.rb
Expand Up @@ -69,6 +69,7 @@ def self.api_key
end

def self.secret_key
key = Facebooker.secret_key
extract_key_from_environment(:secret) || extract_key_from_configuration_file(:secret) rescue report_inability_to_find_key(:secret)
end

Expand All @@ -82,16 +83,16 @@ def self.current=(session)

def login_url(options={})
options = default_login_url_options.merge(options)
"http://www.facebook.com/login.php?api_key=#{@api_key}&v=1.0#{login_url_optional_parameters(options)}"
"#{Facebooker.login_url_base(@api_key)}#{login_url_optional_parameters(options)}"
end

def install_url(options={})
"http://www.facebook.com/install.php?api_key=#{@api_key}&v=1.0#{install_url_optional_parameters(options)}"
"#{Facebooker.install_url_base(@api_key)}#{install_url_optional_parameters(options)}"
end

def permission_url(permission,options={})
options = default_login_url_options.merge(options)
"http://www.facebook.com/authorize.php?api_key=#{@api_key}&v=1.0&ext_perm=#{permission}#{install_url_optional_parameters(options)}"
"http://#{Facebooker.www_server_base_url}/authorize.php?api_key=#{@api_key}&v=1.0&ext_perm=#{permission}#{install_url_optional_parameters(options)}"
end

def install_url_optional_parameters(options)
Expand Down Expand Up @@ -437,8 +438,9 @@ def add_facebook_params(hash, method)
hash[:v] = "1.0"
end
# This ultimately delgates to the adapter
def self.extract_key_from_environment(key_name)
val = ENV["FACEBOOK_" + key_name.to_s.upcase + "_KEY"]
Facebooker.send(key_name.to_s + "_key") rescue nil
end
def self.extract_key_from_configuration_file(key_name)
Expand All @@ -454,7 +456,7 @@ def self.read_configuration_file
end
def service
@service ||= Service.new(API_SERVER_BASE_URL, API_PATH_REST, @api_key)
@service ||= Service.new(Facebooker.api_server_base, Facebooker.api_rest_path, @api_key)
end
def uid
Expand Down

0 comments on commit da5b78a

Please sign in to comment.