class Talkable::API::Base

Public Class Methods

get(path, params = {}) click to toggle source
# File lib/talkable/api/base.rb, line 9
def get(path, params = {})
  uri = request_uri(path, request_params(params))
  request = Net::HTTP::Get.new(uri.request_uri)
  perform_request(uri, request)
end
post(path, params = {}) click to toggle source
# File lib/talkable/api/base.rb, line 15
def post(path, params = {})
  data_request(:post, path, params)
end
put(path, params = {}) click to toggle source
# File lib/talkable/api/base.rb, line 19
def put(path, params = {})
  data_request(:put, path, params)
end

Protected Class Methods

data_request(method, path, params) click to toggle source
# File lib/talkable/api/base.rb, line 25
def data_request(method, path, params)
  http_class = {post: Net::HTTP::Post, put: Net::HTTP::Put}[method.to_sym]
  uri = request_uri(path)
  request = http_class.new(uri.request_uri)
  request.body = request_params(params).to_json
  perform_request(uri, request)
end
parse_response(body) click to toggle source
# File lib/talkable/api/base.rb, line 79
def parse_response(body)
  raise_invalid_response if body.nil?
  result = JSON.parse(body, symbolize_names: true)
  raise_invalid_response unless result.is_a?(Hash)

  if result[:ok]
    result[:result]
  else
    raise BadRequest.new(result[:error_message])
  end

rescue JSON::ParserError
  raise_invalid_response
end
perform_request(uri, request) click to toggle source
# File lib/talkable/api/base.rb, line 56
def perform_request(uri, request)
  http = Net::HTTP.new(uri.host, uri.port)
  http.read_timeout = Talkable.configuration.read_timeout
  http.open_timeout = Talkable.configuration.open_timeout
  http.use_ssl = uri.is_a?(URI::HTTPS)

  request.initialize_http_header request_headers
  process_response http.request(request)
rescue  Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::ETIMEDOUT,
        Errno::EHOSTUNREACH, Errno::ENETUNREACH, SocketError, Timeout::Error,
        OpenSSL::SSL::SSLError, EOFError, Net::HTTPBadResponse => e
  raise NetworkError.new(e.message)
end
process_response(response) click to toggle source
# File lib/talkable/api/base.rb, line 70
def process_response(response)
  case response
  when Net::HTTPSuccess, Net::HTTPClientError
    parse_response response.body
  when Net::HTTPServerError
    raise NetworkError.new("Server #{Talkable.configuration.server} is unavailable. Try again later")
  end
end
raise_invalid_response() click to toggle source
# File lib/talkable/api/base.rb, line 94
def raise_invalid_response
  raise BadRequest.new("Invalid response")
end
request_headers() click to toggle source
# File lib/talkable/api/base.rb, line 47
def request_headers
  {
    'User-Agent'    => "Talkable Gem/#{Talkable::VERSION}",
    'Content-Type'  => 'application/json',
    'Accept'        => 'application/json',
    'Authorization' => "Bearer #{Talkable.configuration.api_key}",
  }
end
request_params(params = {}) click to toggle source
# File lib/talkable/api/base.rb, line 33
def request_params(params = {})
  params.merge({
    site_slug: Talkable.configuration.site_slug,
  })
end
request_uri(path, params = {}) click to toggle source
# File lib/talkable/api/base.rb, line 39
def request_uri(path, params = {})
  URI(
    Furi.update("#{Talkable.configuration.server}/api/#{Talkable::API::VERSION}#{path}",
      query: params
    )
  )
end