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