class Fitbit::Api

Public Class Methods

get_fitbit_methods() click to toggle source
# File lib/api/fitbit_api.rb, line 17
def get_fitbit_methods
  @@fitbit_methods
end
request(consumer_key, consumer_secret, params, auth_token=nil, auth_secret=nil) click to toggle source
# File lib/api/fitbit_api.rb, line 6
def request consumer_key, consumer_secret, params, auth_token=nil, auth_secret=nil
  begin 
    fitbit_api_method = get_api_method(params['api-method'])
    verify_api_call(params, fitbit_api_method, auth_token, auth_secret)
  rescue => e
    raise e
  end
  access_token = build_request(consumer_key, consumer_secret, auth_token, auth_secret)
  send_api_request(params, fitbit_api_method, access_token)
end

Private Class Methods

build_request(consumer_key, consumer_secret, auth_token, auth_secret) click to toggle source
# File lib/api/fitbit_api.rb, line 148
def build_request consumer_key, consumer_secret, auth_token, auth_secret
  fitbit = Fitbit::Api.new :fitbit, consumer_key, consumer_secret
  OAuth::AccessToken.new fitbit.consumer, auth_token, auth_secret
end
build_url(params, fitbit_api_method, http_method) click to toggle source
# File lib/api/fitbit_api.rb, line 209
def build_url params, fitbit_api_method, http_method
  api = {
    :version            => params['api_version'] ? params['api_version'] : @@api_version,
    :url_resources      => get_url_resources(params, fitbit_api_method),
    :response_format    => params['response-format'] ? params['response-format'].downcase : 'xml',
    :post_parameters    => get_post_parameters(params, fitbit_api_method, http_method),
    :query              => uri_encode_query(params['query']),
  }
  "/#{api[:version]}/#{api[:url_resources]}.#{api[:response_format]}#{api[:query]}#{api[:post_parameters]}"
end
get_api_method(api_method) click to toggle source
# File lib/api/fitbit_api.rb, line 23
def get_api_method api_method
  api_method.downcase! if api_method.is_a? String
  @@fitbit_methods[api_method]
end
get_dynamic_url_error(required, supplied) click to toggle source
# File lib/api/fitbit_api.rb, line 118
def get_dynamic_url_error required, supplied
  if missing_dynamic_url_parameters?(required, supplied)
    required = required.select { |k,v| k != 'optional' }
    options = required.keys.map.with_index(1) { |x,i| "(#{i}) #{get_url_parameters_variables(required[x])}" }.join(' ')
    "requires 1 of #{required.length} options: #{options}. You supplied: #{supplied}."
  else
    nil
  end
end
get_dynamic_url_parameters(required, supplied) click to toggle source
# File lib/api/fitbit_api.rb, line 134
def get_dynamic_url_parameters required, supplied
  optional = get_optional_url_parameters(required, supplied)
  required.keys.each { |k| return required[k] + optional if supplied.include? k }
  nil
end
get_error_message(params_keys, fitbit_api_method, auth_token, auth_secret) click to toggle source
# File lib/api/fitbit_api.rb, line 33
def get_error_message params_keys, fitbit_api_method, auth_token, auth_secret
  error_types = [:post_parameters, :url_parameters, :auth_required]
  if !fitbit_api_method
    "is not a valid Fitbit API method."
  else
    error_types.each do |x|
      case x
      when :post_parameters
        error = missing_post_parameters_error(fitbit_api_method[x], params_keys)
      when :url_parameters
        error = missing_url_parameters_error(fitbit_api_method[x], params_keys)
      when :auth_required
        error = missing_auth_tokens_error(fitbit_api_method[x], params_keys, auth_token, auth_secret)
      end
      return error if error
    end
    nil
  end
end
get_optional_url_parameters(required, supplied) click to toggle source
# File lib/api/fitbit_api.rb, line 157
def get_optional_url_parameters required, supplied
  optional = [] unless required['optional']
  optional ? optional : required['optional'].select { |k,v| supplied.include? k }.values.flatten
end
get_post_parameters(params, fitbit, http_method) click to toggle source
# File lib/api/fitbit_api.rb, line 228
def get_post_parameters params, fitbit, http_method
  if http_method == 'post' and !is_subscription? params['api-method']
    post_parameters = params.select { |k,v| fitbit[:post_parameters].values.flatten.include? k }
    "?#{OAuth::Helper.normalize(post_parameters)}"
  else
    nil
  end
end
get_request_headers(params, request_headers) click to toggle source
# File lib/api/fitbit_api.rb, line 205
def get_request_headers params, request_headers
  request_headers ? params.select { |k,v| request_headers.include? k } : nil
end
get_url_parameters(required, supplied) click to toggle source
# File lib/api/fitbit_api.rb, line 153
def get_url_parameters required, supplied
  required.is_a?(Hash) ? get_dynamic_url_parameters(required, supplied) : required
end
get_url_parameters_variables(url_parameters) click to toggle source
# File lib/api/fitbit_api.rb, line 140
def get_url_parameters_variables url_parameters
  url_parameters.select { |x| x.include? "<" }.map { |x| x.delete "<>" } if has_url_variables? url_parameters
end
get_url_resources(params, fitbit_api_method) click to toggle source
# File lib/api/fitbit_api.rb, line 220
def get_url_resources params, fitbit_api_method
  url_parameters = get_url_parameters(fitbit_api_method[:url_parameters], params.keys)
  if has_url_variables? url_parameters or params['user-id'] 
    url_parameters = insert_dynamic_url_parameters(params, url_parameters, fitbit_api_method[:auth_required])
  end
  url_parameters.join("/")
end
has_url_variables?(url_parameters) click to toggle source
# File lib/api/fitbit_api.rb, line 144
def has_url_variables? url_parameters
  url_parameters.each{ |x| return true if x.include? "<" }
end
insert_dynamic_url_parameters(params, url_parameters, auth_required) click to toggle source
# File lib/api/fitbit_api.rb, line 162
def insert_dynamic_url_parameters params, url_parameters, auth_required
  url_parameters.map do |x|
    url_variable = x.delete "<>"

    if x == '-'
      insert_user_id(auth_required, params['user-id'])
    elsif params.include? url_variable and !params.include? x
      is_subscription_variable?(url_variable) ? insert_subscription_variable(params, url_variable) : params[url_variable]
    else
      x
    end
  end - [nil]
end
insert_subscription_variable(params, url_variable) click to toggle source
# File lib/api/fitbit_api.rb, line 185
def insert_subscription_variable params, url_variable
  if url_variable == 'subscription-id'
    params['collection-path'] == 'all' ? params[url_variable] : "#{params[url_variable]}-#{params['collection-path']}"
  else
    params['collection-path'] != 'all' ? params[url_variable] : nil
  end
end
insert_user_id(auth_required, user_id) click to toggle source
# File lib/api/fitbit_api.rb, line 176
def insert_user_id auth_required, user_id
  (auth_required == 'user-id' and user_id) ? user_id : '-'
end
is_subscription?(api_method) click to toggle source
# File lib/api/fitbit_api.rb, line 241
def is_subscription? api_method
  api_method == 'api-create-subscription' or api_method == 'api-delete-subscription'
end
is_subscription_variable?(url_variable) click to toggle source
# File lib/api/fitbit_api.rb, line 180
def is_subscription_variable? url_variable
  subscription_variables = ['subscription-id', 'collection-path']
  subscription_variables.include? url_variable
end
missing_auth_tokens_error(auth_required, params_keys, auth_token, auth_secret) click to toggle source
# File lib/api/fitbit_api.rb, line 97
def missing_auth_tokens_error auth_required, params_keys, auth_token, auth_secret
  error = "requires user auth_token and auth_secret"
  no_auth_tokens = !auth_token or !auth_secret
  if !auth_required
    nil
  elsif no_auth_tokens and auth_required != 'user-id'
    "#{error}."
  elsif no_auth_tokens and auth_required == 'user-id'
    !params_keys.include?('user-id') ? "#{error}, unless you include [\"user-id\"]." : nil
  end
end
missing_dynamic_url_parameters?(required, supplied) click to toggle source
# File lib/api/fitbit_api.rb, line 128
def missing_dynamic_url_parameters? required, supplied
  required = get_dynamic_url_parameters(required, supplied)
  required = get_url_parameters_variables(required) if required
  required & supplied != required  
end
missing_exclusive_post_parameters_error(required, supplied_required) click to toggle source
# File lib/api/fitbit_api.rb, line 76
def missing_exclusive_post_parameters_error required, supplied_required
  total_supplied = supplied_required.length
  if total_supplied < 1
    "requires one of these POST parameters: #{required}." 
  elsif total_supplied > 1
    "allows only one of these POST parameters: #{required}. You used #{supplied_required.join(' AND ')}." 
  else
    nil
  end
end
missing_one_required_post_parameters_error(required, supplied_required) click to toggle source
# File lib/api/fitbit_api.rb, line 87
def missing_one_required_post_parameters_error required, supplied_required
  "requires at least one of the following POST parameters: #{required}." if supplied_required.length < 1
end
missing_post_parameters_error(required, supplied) click to toggle source
# File lib/api/fitbit_api.rb, line 53
def missing_post_parameters_error required, supplied
  required = {} unless required.is_a? Hash
  required.each do |k,v|
    supplied_required = v & supplied unless k == 'required_if'
    case k
    when 'required'
      error = missing_required_post_parameters_error(v, supplied, supplied_required)
    when 'exclusive'
      error = missing_exclusive_post_parameters_error(v, supplied_required)
    when 'one_required'
      error = missing_one_required_post_parameters_error(v, supplied_required)
    when 'required_if'
      error = missing_required_if_post_parameters_error(v, supplied)
    end
    return error if error
  end
  nil
end
missing_required_if_post_parameters_error(required, supplied) click to toggle source
# File lib/api/fitbit_api.rb, line 91
def missing_required_if_post_parameters_error required, supplied
  required.each do |k,v|
    return "requires POST parameter #{v} when you use POST parameter #{k}." if supplied.include? k and !supplied.include? v
  end
end
missing_required_post_parameters_error(required, supplied, supplied_required) click to toggle source
# File lib/api/fitbit_api.rb, line 72
def missing_required_post_parameters_error required, supplied, supplied_required
  "requires POST parameters #{required}. You're missing #{required-supplied}." if supplied_required != required 
end
missing_url_parameters_error(required, supplied) click to toggle source
# File lib/api/fitbit_api.rb, line 109
def missing_url_parameters_error required, supplied
  if required.is_a? Hash
    get_dynamic_url_error(required, supplied)
  else
    required = get_url_parameters_variables(required)
    required - supplied != [] ? "requires #{required}. You're missing #{required-supplied}." : nil
  end
end
send_api_request(params, fitbit, access_token) click to toggle source
# File lib/api/fitbit_api.rb, line 193
def send_api_request params, fitbit, access_token
  http_method = fitbit[:http_method]
  request_headers = get_request_headers(params, fitbit[:request_headers])
  request_url = build_url(params, fitbit, http_method)

  if http_method == 'get' or http_method == 'delete'
    access_token.request( http_method, "http://api.fitbit.com#{request_url}", request_headers )
  else
    access_token.request( http_method, "http://api.fitbit.com#{request_url}", "", request_headers )
  end
end
uri_encode_query(query) click to toggle source
# File lib/api/fitbit_api.rb, line 237
def uri_encode_query query
  query ? "?#{OAuth::Helper.normalize({ 'query' => query })}" : ""
end
verify_api_call(params, fitbit_api_method, auth_token, auth_secret) click to toggle source
# File lib/api/fitbit_api.rb, line 28
def verify_api_call params, fitbit_api_method, auth_token, auth_secret
  error = get_error_message(params.keys, fitbit_api_method, auth_token, auth_secret)
  raise "#{params['api-method']} #{error}" if error
end