class Fabricio::Networking::NetworkClient
This class makes network requests based on request models
Public Class Methods
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
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
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
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
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