class Togglehq::Request

Constants

ACCESS_TOKEN_KEY
V1

Attributes

headers[R]
params[RW]
path[RW]

Public Class Methods

new(path="", params={}, version=V1) click to toggle source
# File lib/togglehq/request.rb, line 14
def initialize(path="", params={}, version=V1)
  @path = path
  @params = params
  @headers = {
    'Accept' => version,
  }
end

Public Instance Methods

delete!() click to toggle source
# File lib/togglehq/request.rb, line 38
def delete!
  request(:delete, path, params)
end
get!() click to toggle source
# File lib/togglehq/request.rb, line 22
def get!
  request(:get, path, params)
end
patch!() click to toggle source
# File lib/togglehq/request.rb, line 34
def patch!
  request(:patch, path, params)
end
post!() click to toggle source
# File lib/togglehq/request.rb, line 26
def post!
  request(:post, path, params)
end
put!() click to toggle source
# File lib/togglehq/request.rb, line 30
def put!
  request(:put, path, params)
end

Private Instance Methods

authenticated_togglehq_api_connection() click to toggle source
# File lib/togglehq/request.rb, line 64
def authenticated_togglehq_api_connection
  token = Togglehq.cache[ACCESS_TOKEN_KEY]
  conn = Togglehq.connection
  conn.headers.merge!({'Authorization' => "Bearer #{token["access_token"]}"})
  conn
end
ensure_togglehq_api_access_token() click to toggle source
# File lib/togglehq/request.rb, line 71
def ensure_togglehq_api_access_token
  token = Togglehq.cache[ACCESS_TOKEN_KEY]
  if !token.nil?
    expires_at = Time.at(token["created_at"] + token["expires_in"])
    if expires_at <= Time.now
      get_new_access_token!
    end
  else
    get_new_access_token!
  end
end
get_new_access_token!() click to toggle source
# File lib/togglehq/request.rb, line 83
def get_new_access_token!
  response = togglehq_api_connection.post do |req|
    req.url "/oauth/token"
    req.headers['Content-Type'] = 'application/json'
    req.body = {grant_type: "client_credentials", scope: "togglehq-lib"}.to_json
  end
  begin
    response_document = JSON.parse(response.body)
    if response_document.has_key?("error")
      process_api_error(response_document)
    else
      Togglehq.cache[ACCESS_TOKEN_KEY] = response_document
    end
  rescue JSON::ParserError
    raise "Fatal: unexpected response from ToggleHQ API: #{response.body}"
  end
end
process_api_error(response_document) click to toggle source
# File lib/togglehq/request.rb, line 101
def process_api_error(response_document)
  if response_document["error"] == "invalid_client"
    raise "Could not authenticate with ToggleHQ API: invalid client_id and/or client_secret."
  else
    raise "Unexpected error from ToggleHQ API: #{response_document["error_description"]}"
  end
end
request(method, path, params) click to toggle source
# File lib/togglehq/request.rb, line 45
def request(method, path, params)
  ensure_togglehq_api_access_token
  conn = authenticated_togglehq_api_connection
  response = conn.send(method) do |req|
    req.url path
    req.headers['Content-Type'] = 'application/json'
    req.headers.merge!(headers)
    req.body = params.to_json
  end
  response
end
togglehq_api_connection() click to toggle source
# File lib/togglehq/request.rb, line 57
def togglehq_api_connection
  conn = Togglehq.connection
  basic = Base64.strict_encode64("#{Togglehq.config.client_id}:#{Togglehq.config.client_secret}")
  conn.headers.merge!({'Authorization' => "Basic #{basic}"})
  conn
end