lib/soapy_cake/client.rb in soapy_cake-0.2.12 vs lib/soapy_cake/client.rb in soapy_cake-0.3.1

- old
+ new

@@ -1,155 +1,5 @@ -require 'sekken' -require 'active_support/core_ext/time/zones' -require 'local_copy' +require 'soapy_cake/client/http_client' +require 'soapy_cake/client/cake_client' -module SoapyCake - class Client - attr_reader :service, :api_key, :domain, :role - - def initialize(service, opts = {}) - @service = service.to_sym - @version = opts[:version] - @role = opts[:role] || :admin - - @domain = opts.fetch(:domain) do - if ENV['CAKE_DOMAIN'].present? - ENV['CAKE_DOMAIN'] - else - fail 'We need a domain' - end - end - - @api_key = opts.fetch(:api_key) do - if opts[:username] && opts[:password] - get_api_key(opts[:username], opts[:password]) - elsif ENV['CAKE_API_KEY'] - ENV['CAKE_API_KEY'] - else - fail 'We need an API key here!' - end - end - end - - def self.method_missing(method, opts = {}) - new(method, opts) - end - - def sekken_client(method) - self.class.sekken_client(wsdl_url(version(method))) - end - - def self.sekken_client(url) - path = LocalCopy.fetch(url) - @sekken_clients ||= {} - @sekken_clients[url] ||= Sekken.new(path, HTTPartySekken.new) - end - - def method_missing(method, opts = {}) - if supported?(method) - method = method.to_s - operation = sekken_client(method).operation(service, "#{service}Soap12", method.camelize) - operation.body = build_body(method, opts) - process_response(method, operation.call.body) - else - super - end - end - - def known_params_for(method) - method = method.to_s - operation = sekken_client(method).operation(service, "#{service}Soap12", method.camelize) - operation.example_body - end - - private - - def build_body(method, opts) - { - method.camelize.to_sym => { api_key: api_key }.merge( - opts.each_with_object({}) do |(key, value), memo| - memo[key] = format_param(value) - end - ) - } - end - - def format_param(value) - case value - when Time - value.utc.strftime('%Y-%m-%dT%H:%M:%S') - when Date - value.strftime('%Y-%m-%dT00:00:00') - else - value - end - end - - def process_response(method, response) - Time.use_zone('UTC') do - fail RequestUnsuccessful, response[:fault][:reason][:text] if response[:fault] - node_name = { - 'affiliate_summary' => 'affiliates', - 'advertiser_summary' => 'advertisers', - 'affiliate_tags' => 'tags', - 'offer_summary' => 'offers', - 'campaign_summary' => 'campaigns', - 'offer_feed' => 'offers', - 'export_affiliate_bills' => 'affiliate_bills', - 'export_advertiser_bills' => 'advertiser_bills', - }.fetch(method, method) - - result = response[:"#{method}_response"][:"#{method}_result"] - fail RequestUnsuccessful, result[:message] if result[:success] == false - return result unless result_has_collection?(result, method) - extract_collection(node_name, result) - .map { |hash| remove_prefix(node_name, hash) } - end - end - - def result_has_collection?(result, method) - !result.key?(:message) && !method.to_s.starts_with?('get_') - end - - def extract_collection(node_name, response) - node_name = node_name.to_sym - if response.key?(node_name) - return [] if response[node_name].nil? - response = response[node_name] - end - [response[response.keys.first]].flatten - end - - def remove_prefix(prefix, object) - object.each_with_object({}) do |(k, v), m| - prefix_ = "#{prefix.singularize}_" - if k.to_s.start_with?(prefix_) - m[k[(prefix_.size)..-1].to_sym] = v - else - m[k] = v - end - end - end - - def get_api_key(username, password) - operation = sekken_client(:get_api_key).operation('get', 'getSoap12', 'GetAPIKey') - operation.body = { GetAPIKey: { username: username, password: password } } - response = operation.call.body - response[:get_api_key_response][:get_api_key_result] - end - - def wsdl_url(version) - role_path = (role && role != :admin) ? "/#{role}" : nil - "https://#{domain}#{role_path}/api/#{version}/#{service}.asmx?WSDL" - end - - def version(method) - API_VERSIONS[role][service][method.to_sym] - end - - def supported?(method) - API_VERSIONS[role][service].keys.include?(method) - end - - class RequestUnsuccessful < RuntimeError; end - end +module SoapyCake::Client end