From da5b78a97a770477eb164fa6da5a86a010723314 Mon Sep 17 00:00:00 2001 From: David Clements Date: Sun, 6 Jul 2008 21:58:43 -0600 Subject: [PATCH] First pass on extracting facebook ENV and Global vars into an Adapter class. BeboAdapter seesm to be working. Need to create some tests. --- init.rb | 2 + lib/facebooker.rb | 37 +++++- lib/facebooker/adapters/bebo_adapter.rb | 41 ++++++ lib/facebooker/adapters/facebook_adapter.rb | 124 ++++++++++++++++++ lib/facebooker/rails/controller.rb | 22 +++- .../rails/facebook_url_rewriting.rb | 2 +- lib/facebooker/rails/helpers.rb | 2 +- lib/facebooker/rails/publisher.rb | 2 +- lib/facebooker/session.rb | 12 +- 9 files changed, 230 insertions(+), 14 deletions(-) create mode 100644 lib/facebooker/adapters/bebo_adapter.rb create mode 100644 lib/facebooker/adapters/facebook_adapter.rb diff --git a/init.rb b/init.rb index 8ad34b8b..e1f294d2 100644 --- a/init.rb +++ b/init.rb @@ -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) diff --git a/lib/facebooker.rb b/lib/facebooker.rb index 9c186b80..5a194da4 100644 --- a/lib/facebooker.rb +++ b/lib/facebooker.rb @@ -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 diff --git a/lib/facebooker/adapters/bebo_adapter.rb b/lib/facebooker/adapters/bebo_adapter.rb new file mode 100644 index 00000000..86fe2713 --- /dev/null +++ b/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 < "apps.facebook.com" + Facebooker.facebook_path_prefix} + {:host => Facebooker.api_server_base_url + Facebooker.facebook_path_prefix} end def controller_path diff --git a/lib/facebooker/session.rb b/lib/facebooker/session.rb index 3e78929d..1de362b7 100644 --- a/lib/facebooker/session.rb +++ b/lib/facebooker/session.rb @@ -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 @@ -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) @@ -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) @@ -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