Class: Cryptomarket::HttpManager

Inherits:
Object
  • Object
show all
Defined in:
lib/cryptomarket/http_manager.rb

Overview

Manager of http requests to the cryptomarket server

Constant Summary collapse

@@API_URL =

rubocop:disable Naming/VariableName,Style/ClassVars

'https://api.exchange.cryptomkt.com'
@@API_VERSION =

rubocop:disable Naming/VariableName,Style/ClassVars

'/api/3/'

Instance Method Summary collapse

Constructor Details

#initialize(api_key:, api_secret:, window: nil) ⇒ HttpManager

Returns a new instance of HttpManager.



34
35
36
37
38
# File 'lib/cryptomarket/http_manager.rb', line 34

def initialize(api_key:, api_secret:, window: nil)
  @credential_factory = Cryptomarket::CredentialsFactory.new(
    api_version: @@API_VERSION, api_key: api_key, api_secret: api_secret, window: window
  )
end

Instance Method Details

#build_headers(method, endpoint, params, public) ⇒ Object



65
66
67
68
69
# File 'lib/cryptomarket/http_manager.rb', line 65

def build_headers(method, endpoint, params, public)
  return {} if public

  { 'Authorization' => @credential_factory.get_credential(method.upcase, endpoint, params) }
end

#build_payload(params) ⇒ Object



71
72
73
74
75
76
77
# File 'lib/cryptomarket/http_manager.rb', line 71

def build_payload(params)
  return nil if params.nil?

  payload = params.compact
  payload = Hash[payload.sort_by { |key, _val| key.to_s }] if payload.is_a?(Hash)
  payload
end

#build_post_headers(endpoint, params) ⇒ Object



90
91
92
93
# File 'lib/cryptomarket/http_manager.rb', line 90

def build_post_headers(endpoint, params)
  { 'Content-Type' => 'application/json',
    'Authorization' => @credential_factory.get_credential('POST'.upcase, endpoint, params.to_json) }
end

#change_credentials(api_key:, api_secret:) ⇒ Object



40
41
42
# File 'lib/cryptomarket/http_manager.rb', line 40

def change_credentials(api_key:, api_secret:)
  @credential_factory.change_credentials(api_key: api_key, api_secret: api_secret)
end

#change_window(window:) ⇒ Object



44
45
46
# File 'lib/cryptomarket/http_manager.rb', line 44

def change_window(window:)
  @credential_factory.change_window(window: window)
end

#do_request(method, uri, payload, headers) ⇒ Object



79
80
81
82
83
84
85
86
87
88
# File 'lib/cryptomarket/http_manager.rb', line 79

def do_request(method, uri, payload, headers)
  args = { method: method.downcase.to_sym, url: uri.to_s, headers: headers }
  if post?(method) || patch?(method)
    args[:payload] = post?(method) ? payload.to_json : payload
  end
  response = RestClient::Request.execute(**args)
  handle_response(response)
rescue RestClient::ExceptionWithResponse => e
  handle_response(e.response)
end

#handle_response(response) ⇒ Object



95
96
97
98
99
100
101
102
103
104
# File 'lib/cryptomarket/http_manager.rb', line 95

def handle_response(response)
  result = response.body
  parsed_result = JSON.parse result
  if (response.code != 200) && !parsed_result['error'].nil?
    error = parsed_result['error']
    exception = Cryptomarket::APIException.new error
    raise exception
  end
  parsed_result
end

#make_post_request(method:, endpoint:, params: nil) ⇒ Object



59
60
61
62
63
# File 'lib/cryptomarket/http_manager.rb', line 59

def make_post_request(method:, endpoint:, params: nil)
  uri = URI(@@API_URL + @@API_VERSION + endpoint)
  payload = build_payload(params)
  do_request(method, uri, payload, build_post_headers(endpoint, payload))
end

#make_request(method:, endpoint:, params: nil, public: false) ⇒ Object



48
49
50
51
52
53
54
55
56
57
# File 'lib/cryptomarket/http_manager.rb', line 48

def make_request(method:, endpoint:, params: nil, public: false)
  uri = URI(@@API_URL + @@API_VERSION + endpoint)
  payload = build_payload(params)
  headers = build_headers(method, endpoint, payload, public)
  if ((method.upcase == 'GET') || (method.upcase == 'PUT')) && !payload.nil?
    uri.query = URI.encode_www_form payload
    payload = nil
  end
  do_request(method, uri, payload, headers)
end