lib/fitbit_api/client.rb in fitbit_api-0.8.3 vs lib/fitbit_api/client.rb in fitbit_api-0.9.0
- old
+ new
@@ -11,50 +11,43 @@
require 'fitbit_api/user'
require 'fitbit_api/water'
module FitbitAPI
class Client
- attr_accessor :api_version, :unit_system, :locale, :scope, :snake_case_keys, :symbolize_keys
+ attr_accessor :api_version, :unit_system, :locale, :scope,
+ :snake_case_keys, :symbolize_keys
attr_reader :user_id
- def initialize(opts)
- missing_args = [:client_id, :client_secret] - opts.keys
- raise FitbitAPI::InvalidArgumentError, "Required arguments: #{missing_args.join(', ')}" if missing_args.size > 0
-
- %w(client_id client_secret redirect_uri site_url authorize_url token_url
- unit_system locale scope api_version snake_case_keys symbolize_keys).each do |attr|
- instance_variable_set("@#{attr}", (opts[attr.to_sym] || FitbitAPI.send(attr)))
- end
-
- @client = OAuth2::Client.new(@client_id, @client_secret, site: @site_url,
- authorize_url: @authorize_url, token_url: @token_url)
-
- restore_token(opts[:refresh_token]) if opts[:refresh_token]
+ def initialize(opts={})
+ validate_args(opts)
+ assign_attrs(opts)
+ set_client
+ establish_token(opts)
end
def auth_url
@client.auth_code.authorize_url(redirect_uri: @redirect_uri, scope: @scope)
end
def get_token(auth_code)
- @token = @client.auth_code.get_token(auth_code, redirect_uri: @redirect_uri, headers: auth_header)
+ @token = @client.auth_code.get_token(
+ auth_code,
+ redirect_uri: @redirect_uri,
+ headers: auth_header
+ )
@user_id = @token.params['user_id']
- return @token
+ @token
end
- def restore_token(refresh_token)
- @token = OAuth2::AccessToken.from_hash(@client, refresh_token: refresh_token).refresh!(headers: auth_header)
- @user_id = @token.params['user_id']
- return @token
- end
-
def token
- @token.expired? ? refresh_token : @token
+ @token.expired? ? refresh_token! : @token
end
- def refresh_token
+ def refresh_token!
@token = @token.refresh!(headers: auth_header)
+ @user_id ||= @token.params['user_id']
+ @token
end
def auth_header
{ 'Authorization' => ('Basic ' + Base64.encode64(@client_id + ':' + @client_secret)) }
end
@@ -88,8 +81,63 @@
def process_keys!(object, opts={})
deep_keys_to_snake_case!(object) if (opts[:snake_case_keys] || snake_case_keys)
deep_symbolize_keys!(object) if (opts[:symbolize_keys] || symbolize_keys)
return object
+ end
+
+ private
+
+ def validate_args(opts)
+ required_args = %i[client_id client_secret].freeze
+ missing_args = []
+
+ required_args.each do |arg|
+ missing_args << arg if (opts[arg] || FitbitAPI.send(arg)).nil?
+ end
+
+ return if missing_args.empty?
+ raise FitbitAPI::InvalidArgumentError,
+ "Required arguments: #{missing_args.join(', ')}"
+ end
+
+ def assign_attrs(opts)
+ attrs = %i[client_id client_secret redirect_uri site_url
+ authorize_url token_url unit_system locale scope
+ api_version snake_case_keys symbolize_keys].freeze
+
+ attrs.each do |attr|
+ instance_variable_set("@#{attr}", (opts[attr] || FitbitAPI.send(attr)))
+ end
+
+ @user_id = opts[:user_id]
+ end
+
+ def set_client
+ @client = OAuth2::Client.new(
+ @client_id,
+ @client_secret,
+ site: @site_url,
+ authorize_url: @authorize_url,
+ token_url: @token_url
+ )
+ end
+
+ def establish_token(opts)
+ return unless opts[:access_token] || opts[:refresh_token]
+
+ if opts[:access_token] && !opts[:user_id]
+ raise FitbitAPI::InvalidArgumentError,
+ 'user_id is required if using existing access token'
+ end
+
+ @token = OAuth2::AccessToken.new(
+ @client,
+ opts[:access_token],
+ refresh_token: opts[:refresh_token],
+ expires_at: opts[:expires_at]
+ )
+
+ refresh_token! if @token.token.empty?
end
end
end