lib/bamboozled/api/base.rb in bamboozled-0.1.0 vs lib/bamboozled/api/base.rb in bamboozled-0.2.0
- old
+ new
@@ -1,81 +1,85 @@
require 'json'
require "time"
-require 'active_support/core_ext/hash/indifferent_access'
module Bamboozled
module API
class Base
attr_reader :subdomain, :api_key
- def initialize(subdomain, api_key)
- @subdomain, @api_key = subdomain, api_key
+ def initialize(subdomain, api_key, httparty_options = {})
+ @subdomain = subdomain
+ @api_key = api_key
+ @httparty_options = httparty_options || {}
end
protected
- def request(method, path, options = {})
- params = {
- path: path,
- options: options,
- method: method
- }
+ def request(method, path, options = {})
+ params = {
+ path: path,
+ options: options,
+ method: method
+ }
- httparty_options = {
- query: options[:query],
- body: options[:body],
- format: :plain,
- basic_auth: auth,
- headers: {
- "Accept" => "application/json",
- "User-Agent" => "Bamboozled/#{Bamboozled::VERSION}"
- }.update(options[:headers] || {})
- }
+ httparty_options = @httparty_options.merge({
+ query: options[:query],
+ body: options[:body],
+ format: :plain,
+ basic_auth: auth,
+ headers: {
+ "Accept" => "application/json",
+ "User-Agent" => "Bamboozled/#{Bamboozled::VERSION}"
+ }.update(options[:headers] || {})
+ })
- response = HTTParty.send(method, "#{path_prefix}#{path}", httparty_options)
- params[:response] = response.inspect.to_s
+ response = HTTParty.send(method, "#{path_prefix}#{path}", httparty_options)
+ params[:response] = response.inspect.to_s
- case response.code
- when 200..201
- begin
- if response.body.to_s.empty?
- {"headers" => response.headers}.with_indifferent_access
- else
- JSON.parse(response.body).with_indifferent_access
- end
- rescue
- MultiXml.parse(response, symbolize_keys: true)
+ case response.code
+ when 200..201
+ begin
+ if response.body.to_s.empty?
+ { "headers" => response.headers }
+ else
+ JSON.parse(response)
end
- when 400
- raise Bamboozled::BadRequest.new(response, params, 'The request was invalid or could not be understood by the server. Resubmitting the request will likely result in the same error.')
- when 401
- raise Bamboozled::AuthenticationFailed.new(response, params, 'Your API key is missing.')
- when 403
- raise Bamboozled::Forbidden.new(response, params, 'The application is attempting to perform an action it does not have privileges to access. Verify your API key belongs to an enabled user with the required permissions.')
- when 404
- raise Bamboozled::NotFound.new(response, params, 'The resource was not found with the given identifier. Either the URL given is not a valid API, or the ID of the object specified in the request is invalid.')
- when 406
- raise Bamboozled::NotAcceptable.new(response, params, 'The request contains references to non-existent fields.')
- when 409
- raise Bamboozled::Conflict.new(response, params, 'The request attempts to create a duplicate. For employees, duplicate emails are not allowed. For lists, duplicate values are not allowed.')
- when 429
- raise Bamboozled::LimitExceeded.new(response, params, 'The account has reached its employee limit. No additional employees could be added.')
- when 500
- raise Bamboozled::InternalServerError.new(response, params, 'The server encountered an error while processing your request and failed.')
- when 502
- raise Bamboozled::GatewayError.new(response, params, 'The load balancer or web server had trouble connecting to the Bamboo app. Please try the request again.')
- when 503
- raise Bamboozled::ServiceUnavailable.new(response, params, 'The service is temporarily unavailable. Please try the request again.')
- else
- raise Bamboozled::InformBamboo.new(response, params, 'An error occurred that we do not now how to handle. Please contact BambooHR.')
+ rescue
+ typecast = options.fetch(:typecast_values, true)
+ MultiXml.parse(response,
+ symbolize_keys: true,
+ typecast_xml_value: typecast)
end
+ when 400
+ raise Bamboozled::BadRequest.new(response, params, 'The request was invalid or could not be understood by the server. Resubmitting the request will likely result in the same error.')
+ when 401
+ raise Bamboozled::AuthenticationFailed.new(response, params, 'Your API key is missing.')
+ when 403
+ raise Bamboozled::Forbidden.new(response, params, 'The application is attempting to perform an action it does not have privileges to access. Verify your API key belongs to an enabled user with the required permissions.')
+ when 404
+ raise Bamboozled::NotFound.new(response, params, 'The resource was not found with the given identifier. Either the URL given is not a valid API, or the ID of the object specified in the request is invalid.')
+ when 406
+ raise Bamboozled::NotAcceptable.new(response, params, 'The request contains references to non-existent fields.')
+ when 409
+ raise Bamboozled::Conflict.new(response, params, 'The request attempts to create a duplicate. For employees, duplicate emails are not allowed. For lists, duplicate values are not allowed.')
+ when 429
+ raise Bamboozled::LimitExceeded.new(response, params, 'The account has reached its employee limit. No additional employees could be added.')
+ when 500
+ raise Bamboozled::InternalServerError.new(response, params, 'The server encountered an error while processing your request and failed.')
+ when 502
+ raise Bamboozled::GatewayError.new(response, params, 'The load balancer or web server had trouble connecting to the Bamboo app. Please try the request again.')
+ when 503
+ raise Bamboozled::ServiceUnavailable.new(response, params, 'The service is temporarily unavailable. Please try the request again.')
+ else
+ raise Bamboozled::InformBamboo.new(response, params, 'An error occurred that we do not now how to handle. Please contact BambooHR.')
end
+ end
- def auth
- { username: api_key, password: "x" }
- end
+ def auth
+ { username: api_key, password: "x" }
+ end
- def path_prefix
- "https://api.bamboohr.com/api/gateway.php/#{subdomain}/v1/"
- end
+ def path_prefix
+ "https://api.bamboohr.com/api/gateway.php/#{subdomain}/v1/"
+ end
end
end
end