iscreen/apple_reporter

View on GitHub
lib/apple_reporter/reporter.rb

Summary

Maintainability
A
45 mins
Test Coverage
module AppleReporter
  class Reporter
    ENDPOINT = 'https://reportingitc-reporter.apple.com/reportservice'
    GZIP_MIMETYPE = '1f8b0800000000000000'.freeze
    #
    # Usage:
    # reporter = Apple::Reporter::Sale.new(user_id: 'iscreen', access_token: 'secret', account: 'myAccount')
    #
    def initialize(config = {})
      @config = {
        sales_path: '/sales/v1',
        finance_path: '/finance/v1',
        mode: 'Robot.XML',
        version: '1_0'
      }.merge(config)
    end

    private

    def fetch(api_path, params, url_params=nil)
      headers = {
        'Content-Type' => 'application/x-www-form-urlencoded'
      }
      payload = {
        userid: @config[:user_id],
        accesstoken: @config[:access_token],
        version: @config[:version],
        mode: @config[:mode],
        queryInput: "[p=Reporter.properties, #{params}]"
      }
      payload[:account] = @config[:account] if @config[:account]
      payload[:password] = @config[:password] if @config[:password]
      response = RestClient.post(
        "#{ENDPOINT}#{api_path}",
        "jsonRequest=#{payload.to_json}#{url_params}",
        headers
      )
      handle_response(@config[:mode], response)
    rescue RestClient::ExceptionWithResponse => err
      if err.response
        handle_response(@config[:mode], err.response)
      else
        raise err
      end
    end

    #
    def handle_response(mode, response)
      if response.code == 200
        if response.headers[:content_type] == 'application/a-gzip'
          decompress_gzip(response.body)
        else
          handle_response_body_with_mode(response.body, mode)
        end
      else
        handle_response_body_with_mode(response.body, mode)
      end
    end

    def handle_response_body_with_mode(body, mode)
      if mode =~ /robot\.xml/i
        Hash.from_xml(body)
      else
        body
      end
    end

    def decompress_gzip(compress_string)
      buffer = []
      chunks = compress_string.unpack('H*').first.split(GZIP_MIMETYPE)
      if chunks.length == 1
        buffer << ActiveSupport::Gzip.decompress([chunks.first].pack('H*'))
      else
        chunks.reject(&:empty?).each do |chunk|
          buffer << Zlib::GzipReader.new(StringIO.new([GZIP_MIMETYPE + chunk].pack('H*'))).read
        end
      end
      buffer.join
    end
  end
end