class RTX::API::Client
Attributes
account_id[RW]
api_url[RW]
email[RW]
expires[RW]
password[RW]
profile_id[RW]
token[RW]
Public Class Methods
new(email = ENV['RTX_USER_EMAIL'], password = ENV['RTX_USER_PASSWORD'], api_url = ENV['RTX_API_URL'])
click to toggle source
# File lib/rtx/api/client.rb, line 11 def initialize(email = ENV['RTX_USER_EMAIL'], password = ENV['RTX_USER_PASSWORD'], api_url = ENV['RTX_API_URL']) @email = email @password = password @api_url = api_url @token = nil @expires = nil end
Public Instance Methods
allowed_resource?(method)
click to toggle source
rubocop:enable Style/MissingRespondToMissing rubocop:enable Style/MethodMissingSuper rubocop:enable Lint/RedundantCopDisableDirective
# File lib/rtx/api/client.rb, line 96 def allowed_resource?(method) unless API::Resources.allowed_resources[method.to_sym] || API::Resources.allowed_builable_resources.key?(method.to_sym) raise API::Errors::InvalidResourceError, "The resource provided (#{method}) is not allowed" end true end
authenticate()
click to toggle source
# File lib/rtx/api/client.rb, line 24 def authenticate request = self.class.post("#{rtx_api_url}/auth", headers: default_headers, basic_auth: { username: email, password: password }) response = Oj.load(request.body, symbol_keys: true) if request.code != 201 raise API::Errors::AuthenticationError, "Authentication Login Error: #{response}" end set_attributes(response[:token], response[:expires_at], response[:account_id], response[:profile_id]) end
authenticate_as(email, &block)
click to toggle source
# File lib/rtx/api/client.rb, line 39 def authenticate_as(email, &block) authenticate if !authenticated? response = collection(:users, email: email) unless response[:_total] == 1 raise API::Errors::ClientError, "User not found with associated email address: #{email}" end user = response[:_embedded][:users][0] auth_response = post(:auth_tokens, account_id: user[:account_id], user_id: user[:id]) client = self.class.new(auth_response[:email], auth_response[:token]) client.set_attributes(auth_response[:token], auth_response[:expires_at], auth_response[:account_id], auth_response[:profile_id]) block.call(client) true end
authenticated?()
click to toggle source
# File lib/rtx/api/client.rb, line 20 def authenticated? !token.nil? && !account_id.nil? && !expired? end
collection(resource_name, attrs = {})
click to toggle source
# File lib/rtx/api/client.rb, line 106 def collection(resource_name, attrs = {}) request = self.class.get("#{rtx_api_url}/#{resource_path(resource_name, attrs)}", options(:get, attrs)) handle_request(request) end
delete(resource_name, resource_id)
click to toggle source
# File lib/rtx/api/client.rb, line 148 def delete(resource_name, resource_id) raise API::Errors::RequestError, 'id was not provided' if resource_id.nil? request = self.class.delete( "#{rtx_api_url}/#{resource_path(resource_name)}/#{resource_id}", options(:delete) ) handle_request(request) end
detail(resource_name, resource_id, attrs = {})
click to toggle source
# File lib/rtx/api/client.rb, line 112 def detail(resource_name, resource_id, attrs = {}) raise API::Errors::RequestError, 'id was not provided' if resource_id.nil? request = self.class.get( "#{rtx_api_url}/#{resource_path(resource_name, attrs)}/#{resource_id}", options(:get, attrs) ) handle_request(request) end
expired?()
click to toggle source
# File lib/rtx/api/client.rb, line 58 def expired? expires.nil? || DateTime.now > DateTime.parse(expires) end
get(resource_name, attrs = {}, file_type = 'json')
click to toggle source
# File lib/rtx/api/client.rb, line 157 def get(resource_name, attrs = {}, file_type = 'json') request = self.class.get("#{rtx_api_url}/#{resource_path(resource_name, attrs)}", options(:get, attrs)) handle_request(request, file_type) end
handle_request(request, file_type = 'json')
click to toggle source
# File lib/rtx/api/client.rb, line 164 def handle_request(request, file_type = 'json') raise API::Errors::RequestError, request.parsed_response.to_s if !request.success? return true if request.parsed_response.nil? case file_type when 'json' Oj.load(request.body, symbol_keys: true) when 'csv' CSV.parse(request.body) end end
logout()
click to toggle source
# File lib/rtx/api/client.rb, line 62 def logout return unless token request = self.class.delete("#{rtx_api_url}/auth", options(:delete)) if request.code != 204 raise API::Errors::AuthenticationError, "Authentication Logout Error: #{request}" end @token = nil @expires = nil @account_id = nil @profile_id = nil end
method_missing(method, *args)
click to toggle source
rubocop:disable Lint/RedundantCopDisableDirective rubocop:disable Style/MissingRespondToMissing rubocop:disable Style/MethodMissingSuper
# File lib/rtx/api/client.rb, line 79 def method_missing(method, *args) return unless allowed_resource?(method) attrs = {} if args.size.positive? attrs = args.last.is_a?(Hash) ? args.pop : {} end # Use V2 Collection if prefixed with V2 return RTX::API::CollectionV2.new(self, method, attrs) if method.to_s.start_with?('v2_') RTX::API::Collection.new(self, method, attrs) end
patch(resource_name, resource_id, attrs = {})
click to toggle source
# File lib/rtx/api/client.rb, line 138 def patch(resource_name, resource_id, attrs = {}) raise API::Errors::RequestError, 'id was not provided' if resource_id.nil? request = self.class.patch( "#{rtx_api_url}/#{resource_path(resource_name, attrs)}/#{resource_id}", options(:patch, attrs) ) handle_request(request) end
post(resource_name, attrs = {})
click to toggle source
# File lib/rtx/api/client.rb, line 122 def post(resource_name, attrs = {}) request = self.class.post("#{rtx_api_url}/#{resource_path(resource_name, attrs)}", options(:post, attrs)) handle_request(request) end
put(resource_name, resource_id, attrs = {})
click to toggle source
# File lib/rtx/api/client.rb, line 128 def put(resource_name, resource_id, attrs = {}) raise API::Errors::RequestError, 'id was not provided' if resource_id.nil? request = self.class.put( "#{rtx_api_url}/#{resource_path(resource_name, attrs)}/#{resource_id}", options(:put, attrs) ) handle_request(request) end
resource_path(resource_name, attrs = {})
click to toggle source
# File lib/rtx/api/client.rb, line 177 def resource_path(resource_name, attrs = {}) path = API::Resources.allowed_resources[resource_name.to_sym] path ||= API::Resources.build_resource(resource_name.to_sym, attrs) if !path raise API::Errors::InvalidResourceError, "The resource provided (#{resource_name}) is not allowed" end path end
set_attributes(token, expires, account_id, profile_id)
click to toggle source
# File lib/rtx/api/client.rb, line 189 def set_attributes(token, expires, account_id, profile_id) @token = token @expires = expires @account_id = account_id @profile_id = profile_id end
Protected Instance Methods
default_headers()
click to toggle source
# File lib/rtx/api/client.rb, line 198 def default_headers { 'Content-Type' => 'application/hal+json', 'Accept' => 'application/hal+json', 'User-Agent' => "rtx-api-client-ruby/#{API::VERSION}" }.freeze end
options(action, attrs = {})
click to toggle source
# File lib/rtx/api/client.rb, line 206 def options(action, attrs = {}) options = { headers: default_headers, basic_auth: { username: email, password: token } } if write_request?(action) options[:body] = Oj.dump(attrs, mode: :compat) else options[:query] = attrs end options end
rtx_api_url()
click to toggle source
# File lib/rtx/api/client.rb, line 216 def rtx_api_url api_url || ENV['RTX_API_URL'] || 'https://api-gateway.reviewtrackers.com' end
write_request?(action)
click to toggle source
# File lib/rtx/api/client.rb, line 220 def write_request?(action) %i[post put patch].include?(action) end