class Fabricio::Networking::NetworkClient

This class makes network requests based on request models

Public Class Methods

new(authorization_client = nil, session_storage = nil) click to toggle source

Initializes a new NetworkClient object

@param authorization_client [Fabricio::Authorization::AuthorizationClient] @param session_storage [Fabricio::Authorization::AbstractSessionStorage] @return [Fabricio::Networking::NetworkClient]

# File lib/fabricio/networking/network_client.rb, line 16
def initialize(authorization_client = nil, session_storage = nil)
  @authorization_client = authorization_client
  @session_storage = session_storage
  @is_refreshing_session = false
end

Public Instance Methods

perform_request(model) click to toggle source

Performs a network request based on a passed request model

@param model [Fabricio::Networking::RequestModel] @return [String]

# File lib/fabricio/networking/network_client.rb, line 26
def perform_request(model)
  session = @session_storage.obtain_session
  model = sign_model(model, session)

  connection = Faraday.new(:url => model.base_url) do |faraday|
    faraday.adapter Faraday.default_adapter
  end

  if model.type == :GET
    result = perform_get_request(connection, model)
  elsif model.type == :POST
    result = perform_post_request(connection, model)
  end

  # If there is an authorization error and we aren't already trying to refresh it, we make a refresh session call and retry the initial network request.
  is_authorization_error = result.success? == false && [401, 402].include?(result.status)
  if is_authorization_error && @is_refreshing_session == false
    refreshed_session = @authorization_client.refresh(session)
    @session_storage.store_session(refreshed_session)

    @is_refreshing_session = true
    return perform_request(model)
  end

  # If authorization returns 401 and refresh session operation failed we throw exception
  if is_authorization_error && @is_refreshing_session == true
    raise StandardError.new('Can`t refresh session. Try once again later or repeat authorization manually')
  end

  if is_authorization_error == false
    @is_refreshing_session = false
  end
  result
end

Private Instance Methods

perform_get_request(connection, model) click to toggle source

Performs a GET network request based on a passed request model

@param connection [Faraday::Connection] @param model [Fabricio::Networking::RequestModel] @return [String]

# File lib/fabricio/networking/network_client.rb, line 78
def perform_get_request(connection, model)
  connection.get do |req|
    req.url model.api_path
    req.headers = model.headers
    req.params = model.params
  end
end
perform_post_request(connection, model) click to toggle source

Performs a POST network request based on a passed request model

@param connection [Faraday::Connection] @param model [Fabricio::Networking::RequestModel] @return [String]

# File lib/fabricio/networking/network_client.rb, line 91
def perform_post_request(connection, model)
  connection.post do |req|
    req.url model.api_path
    req.headers = model.headers
    req.body = model.body
  end
end
sign_model(model, session) click to toggle source

Signs a request model with authorization data

@param model [Fabricio::Networking::RequestModel] @param session [Fabricio::Authorization::Session] @return [String]

# File lib/fabricio/networking/network_client.rb, line 68
def sign_model(model, session)
  model.headers['Authorization'] = "Bearer #{session.access_token}"
  model
end