module QboApi::Connection

Public Instance Methods

authorized_json_connection(url, headers: nil) click to toggle source
# File lib/qbo_api/connection.rb, line 9
def authorized_json_connection(url, headers: nil)
  headers ||= {}
  headers['Accept'] ||= 'application/json'
  headers['Content-Type'] ||= 'application/json;charset=UTF-8'
  build_connection(url, headers: headers) do |conn|
    conn.response :json
    add_authorization_middleware(conn)
    conn.request :url_encoded
    add_exception_middleware(conn)
    add_connection_adapter(conn)
  end
end
authorized_multipart_connection(url) click to toggle source
# File lib/qbo_api/connection.rb, line 22
def authorized_multipart_connection(url)
  headers = {
    'Content-Type' => 'multipart/form-data',
    'Accept' => 'application/json'
  }
  build_connection(url, headers: headers) do |conn|
    conn.response :json
    add_authorization_middleware(conn)
    add_exception_middleware(conn)
    conn.request :multipart
    add_connection_adapter(conn)
  end
end
build_connection(url, headers: nil) { |conn| ... } click to toggle source
# File lib/qbo_api/connection.rb, line 36
def build_connection(url, headers: nil)
  Faraday.new(url: url) { |conn|
    conn.response :detailed_logger, QboApi.logger, LOG_TAG if QboApi.log
    conn.headers.update(headers) if headers
    yield conn if block_given?
  }
end
raw_request(method, conn:, path:, payload: nil, params: nil, headers: nil) click to toggle source
# File lib/qbo_api/connection.rb, line 49
def raw_request(method, conn:, path:, payload: nil, params: nil, headers: nil)
  path = finalize_path(path, method: method, params: params)

  conn.public_send(method) do |req|
    req.headers = headers if headers

    case method
    when :get, :delete
      req.url path
    when :post, :put
      req.url path
      req.body = payload.to_json
    else raise ArgumentError, "Unhandled request method '#{method.inspect}'"
    end
  end
end
request(method, path:, entity: nil, payload: nil, params: nil, headers: nil) click to toggle source
# File lib/qbo_api/connection.rb, line 44
def request(method, path:, entity: nil, payload: nil, params: nil, headers: nil)
  raw_response = raw_request(method, conn: connection, path: path, params: params, payload: payload, headers: headers)
  response(raw_response, entity: entity, headers: headers)
end
response(resp, entity: nil, headers: false) click to toggle source
# File lib/qbo_api/connection.rb, line 66
def response(resp, entity: nil, headers: false)
  data = resp.body

  if headers
    content_type = headers['Accept'] || headers['Content-Type']
    return data if content_type&.include?('application/pdf')
  end

  entity ? entity_response(data, entity) : data
rescue => e
  QboApi.logger.debug { "#{LOG_TAG} response parsing error: entity=#{entity.inspect} body=#{resp.body.inspect} exception=#{e.inspect}" }
  data
end

Private Instance Methods

add_authorization_middleware(conn) click to toggle source

Faraday 2 deprecated the FaradayMiddleware gem. Middleware is now part of Faraday itself, and :authorization can be used to pass the Bearer token.

# File lib/qbo_api/connection.rb, line 112
def add_authorization_middleware(conn)
  conn.request :authorization, 'Bearer', access_token
end
add_connection_adapter(conn) click to toggle source
# File lib/qbo_api/connection.rb, line 101
def add_connection_adapter(conn)
  conn.adapter Faraday.default_adapter
end
add_exception_middleware(conn) click to toggle source
# File lib/qbo_api/connection.rb, line 105
def add_exception_middleware(conn)
  conn.use QboApi::RaiseHttpException
end
entity_name(entity) click to toggle source
# File lib/qbo_api/connection.rb, line 116
def entity_name(entity)
  singular(entity)
end
entity_response(data, entity) click to toggle source
# File lib/qbo_api/connection.rb, line 82
def entity_response(data, entity)
  entity_name = entity_name(entity)
  if data.key?('QueryResponse')
    entity_body = data['QueryResponse']
    return nil if entity_body.empty?
    entity_body.fetch(entity_name, data)
  elsif data.key?('AttachableResponse')
    entity_body = data['AttachableResponse']
    entity_body &&= entity_body.first
    entity_body.fetch(entity_name, data)
  else
    entity_body = data
    entity_body.fetch(entity_name) do
      QboApi.logger.debug { "#{LOG_TAG} entity name not in response body: entity=#{entity.inspect} entity_name=#{entity_name.inspect} body=#{data.inspect}" }
      data
    end
  end
end