class FrilansFinansAPI::Request

Constants

GRANT_TYPE
HEADERS
USER_AGENT

Attributes

access_token[R]
base_uri[R]
credentials[R]

Public Class Methods

new(base_uri: nil, client_id: nil, client_secret: nil) click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 20
def initialize(base_uri: nil, client_id: nil, client_secret: nil)
  @base_uri = base_uri || FrilansFinansAPI.config.base_uri
  @credentials = {
    grant_type: GRANT_TYPE,
    client_id: client_id || FrilansFinansAPI.config.client_id,
    client_secret: client_secret || FrilansFinansAPI.config.client_secret
  }
  @access_token = nil
end

Public Instance Methods

_get(uri:, query: {}) click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 48
def _get(uri:, query: {})
  opts = build_get_opts(query: query)
  response = HTTParty.get("#{base_uri}#{uri}", opts)
  log_response(:get, uri: uri, params: opts, response: response)
  response
end
_patch(uri:, query: {}, body: {}) click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 62
def _patch(uri:, query: {}, body: {})
  opts = build_post_opts(query: query, body: body)
  response = HTTParty.patch("#{base_uri}#{uri}", opts)
  log_response(:patch, uri: uri, params: opts, response: response)
  response
end
_post(uri:, query: {}, body: {}) click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 55
def _post(uri:, query: {}, body: {})
  opts = build_post_opts(query: query, body: body)
  response = HTTParty.post("#{base_uri}#{uri}", opts)
  log_response(:post, uri: uri, params: opts, response: response)
  response
end
get(uri:, query: {}) click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 30
def get(uri:, query: {})
  authorized_request do
    _get(uri: uri, query: query)
  end
end
patch(uri:, query: {}, body: {}) click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 42
def patch(uri:, query: {}, body: {})
  authorized_request do
    _patch(uri: uri, query: query, body: body.to_json)
  end
end
post(uri:, query: {}, body: {}) click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 36
def post(uri:, query: {}, body: {})
  authorized_request do
    _post(uri: uri, query: query, body: body.to_json)
  end
end

Private Instance Methods

auth_headers() click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 100
def auth_headers
  { 'Authorization' => "Bearer #{access_token}" }
end
authorized_request() { || ... } click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 86
def authorized_request
  fetch_access_token if access_token.nil?

  response = yield
  return response unless reauthorize?(response)

  fetch_access_token
  yield
end
build_get_opts(query: {}) click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 71
def build_get_opts(query: {})
  { query: query }.merge(headers: headers)
end
build_post_opts(query: {}, body: {}) click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 75
def build_post_opts(query: {}, body: {})
  {
    query: query,
    body: body
  }.merge(headers: headers)
end
extract_access_token(response) click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 113
def extract_access_token(response)
  parsed = response.parsed_response

  # In tests HTTParty and Webmock aren't friends, causing HTTParty to return a string
  # from #parsed_response instead of a Hash
  parsed = JSON.parse(parsed) if parsed.is_a?(String)

  parsed['access_token']
end
fetch_access_token() click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 104
def fetch_access_token
  uri = "#{base_uri}/auth/accesstoken"
  response = HTTParty.post(uri, body: credentials, headers: USER_AGENT)
  log_response(:post, uri: uri, params: {}, response: response)

  @access_token = extract_access_token(response)
  response
end
headers() click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 82
def headers
  HEADERS.merge(auth_headers).dup
end
log_response(method, uri:, params:, response:) click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 123
def log_response(method, uri:, params:, response:)
  log_id = "[#{self.class.name}]"
  verb = method.to_s.upcase
  body = response.body
  json_params = params.to_json
  status = response.code
  log_body = [
    log_id,
    verb,
    "URI: #{uri}",
    "PARAMS: #{json_params}",
    "STATUS: #{status}",
    "BODY: #{body}"
  ].join(' ')
  FrilansFinansAPI.config.event_logger.request_event(params: json_params,
                                                     status: status,
                                                     verb: verb,
                                                     uri: uri,
                                                     body: body)
  FrilansFinansAPI.config.logger.info log_body
end
reauthorize?(response) click to toggle source
# File lib/frilans_finans_api/client/request.rb, line 96
def reauthorize?(response)
  response.code == '401'
end