class ImpactRadiusAPI::APIResource

Public Instance Methods

base_path() click to toggle source
# File lib/impact_radius_api/api_resource.rb, line 9
def base_path
  if self.class_name == "APIResource"
    raise NotImplementedError.new("APIResource is an abstract class. You should perform actions on its subclasses (i.e. Publisher)")
  end
  "/#{CGI.escape(class_name)}/"
end
class_name() click to toggle source
# File lib/impact_radius_api/api_resource.rb, line 5
def class_name
  self.class.name.split('::')[-1]
end
get(api_resource, params = {}) click to toggle source
# File lib/impact_radius_api/api_resource.rb, line 16
def get(api_resource, params = {})
  @resource ||= self.xml_field(api_resource)
  unless auth_token ||= ImpactRadiusAPI.auth_token
    raise AuthenticationError.new(
      "No authentication token (AuthToken) provided. Set your API key using 'ImpactRadiusAPI.auth_token = <API-KEY>'. " +
      "You can retrieve your authentication token (AuthToken) from the Impact Radius web interface. " +
      "See http://dev.impactradius.com/display/api/Getting+Started for details."
    )
  end
  if auth_token =~ /\s/
    raise AuthenticationError.new(
      "Your authentication token (AuthToken) looks invalid. " +
      "Double-check your authentication token (AuthToken) at http://dev.impactradius.com/display/api/Getting+Started"
    )
  end

  unless account_sid ||= ImpactRadiusAPI.account_sid
    raise AuthenticationError.new(
      "No account_sid (AccountSid) provided. Set your account_sid (AccountSid) using 'ImpactRadiusAPI.account_sid = <AccountSid>'. " +
      "You can retrieve your account_sid (AccountSid) from the Impact Radius web interface. " +
      "See http://dev.impactradius.com/display/api/Getting+Started for details."
    )
  end

  if account_sid =~ /\s/ || account_sid.length != 34 || account_sid[0..1] != "IR"
    raise AuthenticationError.new(
      "Your account_sid (AccountSid) looks invalid. " +
      "Double-check your account_sid (AccountSid) at http://dev.impactradius.com/display/api/Getting+Started"
    )
  end

  raise ArgumentError, "Params must be a Hash; got #{params.class} instead" unless params.is_a? Hash

  #resource_url = ImpactRadiusAPI.api_base_url + base_path + api_resource
  resource_url = "https://" + account_sid + ":" + auth_token +"@" + pre_uri +  ImpactRadiusAPI.api_base_uri + base_path + account_sid + "/" + api_resource
  request(resource_url, params)
end
request(resource_url, params = {}) click to toggle source
# File lib/impact_radius_api/api_resource.rb, line 54
def request(resource_url, params = {})
  timeout = ImpactRadiusAPI.api_timeout

  @resource ||= self.xml_field(resource_url.match(/\/[a-z]+(\?|\z)/i)[0].gsub("/","").gsub("?",""))
  
  begin
    response = self.class.get(resource_url, query: params, timeout: timeout)
  rescue Timeout::Error
    raise ConnectionError.new("Timeout error (#{timeout}s)")
  end
  process(response)
end

Private Instance Methods

pre_uri() click to toggle source
# File lib/impact_radius_api/api_resource.rb, line 83
def pre_uri
  if %w(Ads PromotionalAds ActionInquiries Campaigns Acitons).include? @resource
    ""
  else
    "product."
  end
end
process(response) click to toggle source
# File lib/impact_radius_api/api_resource.rb, line 69
def process(response)

  case response.code
  when 200, 201, 204
    APIResponse.new(response, @resource)
  when 400, 404
    raise InvalidRequestError.new(response["ImpactRadiusResponse"]["Message"], response.code)
  when 401
    raise AuthenticationError.new(response.body, response.code)
  else
    raise Error.new(response["ImpactRadiusResponse"]["Message"], response.code)
  end
end