lib/ecircle/client.rb in ecircle-0.0.5 vs lib/ecircle/client.rb in ecircle-0.0.6

- old
+ new

@@ -1,50 +1,96 @@ module Ecircle class Client + attr_accessor :auth_token + + def ensuring_logon &block + begin + @auth_token ||= logon + rescue Savon::SOAP::Fault => e + # If we are here this probably means that our login credentials are wrong. + response = e.to_hash + if response[:fault][:faultcode] == 'soapenv:Server.userException' && response[:fault][:detail][:fault][:code] == '502' + help = <<-doc + !!! + Got an authentication exception, chances are good that you're credentials are wrong, so better double check that. + You can explicitly check for it by calling something like: + Ecircle.configure do.. + Ecircle.logon + !!! + doc + puts help + else + puts "!!! Got an unexpected fault code from Savon: #{response.inspect} !!!" + end + raise + rescue => e + puts "!!! Got unexpected non-Savon exception: #{e.class} !!!" + raise + end + + first_try = true + begin + block.call + rescue Savon::SOAP::Fault => e + # If we are here that probably means that our session token has expired. + if first_try + first_try = false + @auth_token = logon + retry + else + puts "!!! Could not re-authenticate after session expired: #{e.to_hash.inspect} !!!" + raise + end + end + end + def client @client ||= Savon::Client.new do wsdl.document = Ecircle.configuration.wsdl wsdl.endpoint = Ecircle.configuration.endpoint wsdl.namespace = Ecircle.configuration.namespace end end def create_member user_id, group_id, invite = false, send_message = false - session_id = logon - @response = client.request :createMember do - soap.body = { - :session => session_id, - :userId => user_id, - :groupId => group_id, - :invite => invite.to_s, - :sendMessage => send_message.to_s - } + ensuring_logon do + @response = client.request :createMember do + soap.body = { + :session => auth_token, + :userId => user_id, + :groupId => group_id, + :invite => invite.to_s, + :sendMessage => send_message.to_s + } + end + @response.body[:create_member_response][:create_member_return].to_s end - @response.body[:create_member_response][:create_member_return].to_s end def create_or_update_user_by_email email - session_id = logon - @response = client.request :createOrUpdateUserByEmail do - soap.body = { - :session => session_id, - :userXml => "<user><email>#{email}</email></user>", - :sendMessage => 0 - } + ensuring_logon do + @response = client.request :createOrUpdateUserByEmail do + soap.body = { + :session => auth_token, # TODO We can't use @auth_token here cause then the session_id is nil. Why? + :userXml => "<user><email>#{email}</email></user>", + :sendMessage => 0 + } + end + @response.body[:create_or_update_user_by_email_response][:create_or_update_user_by_email_return].to_s end - @response.body[:create_or_update_user_by_email_response][:create_or_update_user_by_email_return].to_s end def delete_member member_id - session_id = logon - @response = client.request :deleteMember do - soap.body = { - :session => session_id, - :memberId => member_id - } + ensuring_logon do + @response = client.request :deleteMember do + soap.body = { + :session => auth_token, + :memberId => member_id + } + end + @response.body[:delete_member_response][:delete_member_return].to_s end - @response.body[:delete_member_response][:delete_member_return].to_s end def logon @response = client.request :logon do soap.body = { @@ -55,18 +101,19 @@ end @response.body[:logon_response][:logon_return].to_s end def send_parametrized_single_message_to_user user_id, message_id, names = [], values = [] - session_id = logon - @response = client.request :sendParametrizedSingleMessageToUser do - soap.body = { - :session => session_id, - :singleMessageId => message_id, - :userId => user_id, - :names => names, - :values => values - } + ensuring_logon do + @response = client.request :sendParametrizedSingleMessageToUser do + soap.body = { + :session => auth_token, + :singleMessageId => message_id, + :userId => user_id, + :names => names, + :values => values + } + end end end end end