Class: ApiClient

Inherits:
Object
  • Object
show all
Defined in:
motion-prime/api_client.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ ApiClient

Returns a new instance of ApiClient.



4
5
6
7
8
9
10
# File 'motion-prime/api_client.rb', line 4

def initialize(options = {})
  self.access_token = options[:access_token]
  AFMotion::Client.build_shared(config.base) do
    header "Accept", "application/json"
    response_serializer AFJSONResponseSerializer.serializerWithReadingOptions(NSJSONReadingMutableContainers)
  end
end

Instance Attribute Details

#access_tokenObject

Returns the value of attribute access_token.



2
3
4
# File 'motion-prime/api_client.rb', line 2

def access_token
  @access_token
end

Instance Method Details

#authenticate(username = nil, password = nil, data = nil, &block) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'motion-prime/api_client.rb', line 27

def authenticate(username = nil, password = nil, data = nil, &block)
  data ||= {
    grant_type: "password",
    username: username,
    password: password,
    client_id: config.client_id,
    client_secret: config.client_secret
  }
  use_callback = block_given?
  AFMotion::Client.shared.post(config.auth_path, request_params(data)) do |response|
    auth_data = response.object

    self.access_token = auth_data[:access_token] if auth_data
    block.call(auth_data, response.operation.response.try(:statusCode)) if use_callback
  end
  true
end

#cached_request!(method, path, data, files = nil, options = {}, &block) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'motion-prime/api_client.rb', line 94

def cached_request!(method, path, data, files = nil, options = {}, &block)
  use_callback = block_given?
  params = data.map { |key, value| "#{key}=#{value}" }.join('&')
  cache_key = [method, path, params].join(' ')
  response = read_cache(cache_key)
  if response && use_callback
    block.call(prepare_response_object(response), 200)
  else
    request!(method, path, data, files, options) do |response, status|
      write_cache(cache_key, response)
      block.call(response, status) if use_callback
    end
  end
end

#delete(path, params = {}, options = {}, &block) ⇒ Object



121
122
123
# File 'motion-prime/api_client.rb', line 121

def delete(path, params = {}, options = {}, &block)
  request(:delete, path, params, options, &block)
end

#get(path, params = {}, options = {}, &block) ⇒ Object



109
110
111
# File 'motion-prime/api_client.rb', line 109

def get(path, params = {}, options = {}, &block)
  request(:get, path, params, options, &block)
end

#page_url(path) ⇒ Object



45
46
47
# File 'motion-prime/api_client.rb', line 45

def page_url(path)
  path_with_base(path, config.base)
end

#post(path, params = {}, options = {}, &block) ⇒ Object



117
118
119
# File 'motion-prime/api_client.rb', line 117

def post(path, params = {}, options = {}, &block)
  request(:post, path, params, options, &block)
end

#put(path, params = {}, options = {}, &block) ⇒ Object



113
114
115
# File 'motion-prime/api_client.rb', line 113

def put(path, params = {}, options = {}, &block)
  request(:put, path, params, options, &block)
end

#queue(item) ⇒ Object



125
126
127
128
129
# File 'motion-prime/api_client.rb', line 125

def queue(item)
  queue_list = user_defaults['api_client_queue'].clone || []
  queue_list.push(item)
  user_defaults['api_client_queue'] = queue_list
end

#read_cache(key) ⇒ Object

TODO: temporary solution, add real caching system here



132
133
134
135
# File 'motion-prime/api_client.rb', line 132

def read_cache(key)
  @cache ||= {}
  @cache[key]
end

#request(method, path, params = {}, options = {}, &block) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'motion-prime/api_client.rb', line 54

def request(method, path, params = {}, options = {}, &block)
  files = params.delete(:_files)
  data = request_params(params.merge(access_token: access_token))

  if !options.has_key?(:allow_queue) && config.default_methods_queue.include?(method.to_sym)
    options[:allow_queue] = true
  end

  if !options.has_key?(:allow_cache) && config.default_methods_cache.include?(method.to_sym)
    options[:allow_cache] = true
  end

  if allow_cache?(method, path, options)
    cached_request!(method, path, data, files, options, &block)
  else
    request!(method, path, data, files, options, &block)
  end
end

#request!(method, path, data, files = nil, options = {}, &block) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'motion-prime/api_client.rb', line 73

def request!(method, path, data, files = nil, options = {}, &block)
  use_callback = block_given?
  path = path_with_base(path, config.api_namespace)
  client_method = files.present? ? :"multipart_#{method}" : method
  AFMotion::Client.shared.send client_method, path, data do |response, form_data, progress|
    if form_data && files.present?
      append_files_to_data(files, form_data)
    elsif progress
      # handle progress
    elsif !response.success? && allow_queue?(method, path, options)
      queue(method: method, path: path, params: params)
    elsif response.operation.response.nil?
      block.call if use_callback
    else
      prepared_response = prepare_response_object(response.object)
      block.call(prepared_response, response.operation.response.statusCode) if use_callback
      process_queue if config.allow_queue?
    end
  end
end

#request_params(data) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'motion-prime/api_client.rb', line 12

def request_params(data)
  params = data.clone

  if config.http_auth?
    params.merge!(credentials: config.http_auth.to_hash)
  end
  if config.sign_request?
    signature = RmDigest::MD5.hexdigest(
      config.signature_secret + params.keys.map(&:to_s).sort.join
    )
    params.merge!(sign: signature)
  end
  params
end

#resource_url(path) ⇒ Object



49
50
51
52
# File 'motion-prime/api_client.rb', line 49

def resource_url(path)
  base = config.resource_base? ? config.resource_base : config.base
  path_with_base(path, base)
end

#write_cache(key, data) ⇒ Object

TODO: temporary solution, add real caching system here



138
139
140
141
# File 'motion-prime/api_client.rb', line 138

def write_cache(key, data)
  @cache ||= {}
  @cache[key] = data
end