class Seeuletter::Resources::ResourceBase

Attributes

config[R]
endpoint[R]

Public Class Methods

new(config) click to toggle source
# File lib/seeuletter/resources/resource_base.rb, line 11
def initialize(config)
  @config = config
end

Public Instance Methods

create(options={}, headers={}) click to toggle source
# File lib/seeuletter/resources/resource_base.rb, line 23
def create(options={}, headers={})
  submit :post, endpoint_url, options, headers
end
destroy(resource_id) click to toggle source
# File lib/seeuletter/resources/resource_base.rb, line 27
def destroy(resource_id)
  submit :delete, resource_url(resource_id)
end
find(resource_id) click to toggle source
# File lib/seeuletter/resources/resource_base.rb, line 19
def find(resource_id)
  submit :get, resource_url(resource_id)
end
list(options={}) click to toggle source
# File lib/seeuletter/resources/resource_base.rb, line 15
def list(options={})
  submit :get, endpoint_url, options
end

Private Instance Methods

base_url() click to toggle source
# File lib/seeuletter/resources/resource_base.rb, line 95
def base_url
  "https://#{config[:api_key]}:@api.seeuletter.com"
end
build_nested_query(value, prefix = nil) click to toggle source
# File lib/seeuletter/resources/resource_base.rb, line 79
def build_nested_query(value, prefix = nil)
  case value
  when Array
    value.map { |v|
      build_nested_query(v, "#{prefix}[]")
    }.join("&")
  when Hash
    value.map { |k, v|
      build_nested_query(v, prefix ? "#{prefix}[#{URI.encode_www_form_component(k)}]" : URI.encode_www_form_component(k))
    }.reject(&:empty?).join('&')
  else
    raise ArgumentError, "value must be an Array or Hash" if prefix.nil?
    "#{prefix}=#{URI.encode_www_form_component(value)}"
  end
end
endpoint_url() click to toggle source
# File lib/seeuletter/resources/resource_base.rb, line 99
def endpoint_url
  "#{base_url}/#{endpoint}"
end
handle_api_error(error) click to toggle source
# File lib/seeuletter/resources/resource_base.rb, line 67
def handle_api_error(error)
  begin
    response = JSON.parse(error.http_body.to_s)
    message = response.fetch("error").fetch("message")
    raise InvalidRequestError.new(message, error.http_code, error.http_body, error.response)
  rescue JSON::ParserError, KeyError
    # :nocov:
    raise SeeuletterError.new("Invalid response object:", error.http_code, error.http_body)
    # :nocov:
  end
end
resource_url(resource_id) click to toggle source
# File lib/seeuletter/resources/resource_base.rb, line 103
def resource_url(resource_id)
  "#{endpoint_url}/#{resource_id}"
end
submit(method, url, parameters={}, headers={}) click to toggle source
# File lib/seeuletter/resources/resource_base.rb, line 33
def submit(method, url, parameters={}, headers={})
  clientVersion = Seeuletter::VERSION

  begin
    if method == :get || method == :delete
      # Hack to URL encode nested objects like metadata.
      url = "#{url}?#{build_nested_query(parameters)}"
      response = RestClient.send(method, url, {
        user_agent: 'Seeuletter/v1 RubyBindings/' + clientVersion,
        "Seeuletter-Version" => config[:api_version]
      })
    else
      headers = headers.merge({
        user_agent: 'Seeuletter/v1 RubyBindings/' + clientVersion,
        "Seeuletter-Version" => config[:api_version]
      })
      response = RestClient.send(method, url, parameters, headers)
    end

    body = JSON.parse(response)

    body.define_singleton_method(:_response) do
      response
    end

    return body

  rescue RestClient::ExceptionWithResponse => e
    handle_api_error(e)
  end
end