module Copperegg::Revealmetrics::Mixins::Persistence

Attributes

resource_name[R]
error[R]
id[R]

Public Class Methods

create(params) click to toggle source
# File lib/copperegg/revealmetrics/mixins/persistence.rb, line 31
def create(params)
  params.delete(:id)
  params.delete("id")
  new(params).save
end
delete(id) click to toggle source
# File lib/copperegg/revealmetrics/mixins/persistence.rb, line 37
def delete(id)
  request(:id => id, :request_type => "delete")
end
find(*args) click to toggle source
# File lib/copperegg/revealmetrics/mixins/persistence.rb, line 17
def find(*args)
  params = args.last.class == Hash ? args.pop : {}
  id = args.first
  response = request(params.merge(:request_type => "get", :id => id))
  if response.code == "200"
    json = JSON.parse(response.body)
    if json.is_a?(Array)
      json.map { |attributes| new(attributes) }
    else
      new(json)
    end
  end
end
included(klass) click to toggle source
# File lib/copperegg/revealmetrics/mixins/persistence.rb, line 12
def self.included(klass)
  klass.class_eval do
    class << self
      attr_reader :resource_name

      def find(*args)
        params = args.last.class == Hash ? args.pop : {}
        id = args.first
        response = request(params.merge(:request_type => "get", :id => id))
        if response.code == "200"
          json = JSON.parse(response.body)
          if json.is_a?(Array)
            json.map { |attributes| new(attributes) }
          else
            new(json)
          end
        end
      end

      def create(params)
        params.delete(:id)
        params.delete("id")
        new(params).save
      end

      def delete(id)
        request(:id => id, :request_type => "delete")
      end

      def request(params={})
        request_type = params.delete(:request_type)
        raise "invalid type `#{request_type}`" if !%w(get post put delete).include?(request_type)
        id = params.delete(:id)

        uri = id ? URI.parse("#{Api.uri}/#{self.resource_name}/#{id}.json") : URI.parse("#{Api.uri}/#{self.resource_name}.json")

        http = Net::HTTP.new(uri.host, uri.port)
        http.use_ssl = uri.scheme == 'https'
        http.verify_mode = OpenSSL::SSL::VERIFY_NONE if !Api.ssl_verify_peer

        request = Net::HTTP.const_get(request_type.capitalize).new(uri.request_uri)
        request.body = JSON.generate(params) unless params.empty?
        request.basic_auth(Api.apikey, "U")
        request["Content-Type"] = "application/json"

        begin
          response = http.request(request)
        rescue Exception => e
          raise e
        end

        response
      end

      def request_200(params={})
        response = request(params)
        unless response.code === "200"
          raise HttpError.new("HTTP request failed with code `#{response.code}`: `#{response.body}`")
        end
        response
      end

      private

      def resource(value)
        @resource_name = value
      end
    end
  end
end
new(attributes={}) click to toggle source
# File lib/copperegg/revealmetrics/mixins/persistence.rb, line 85
def initialize(attributes={})
  load_attributes(attributes)
end
request(params={}) click to toggle source
# File lib/copperegg/revealmetrics/mixins/persistence.rb, line 41
def request(params={})
  request_type = params.delete(:request_type)
  raise "invalid type `#{request_type}`" if !%w(get post put delete).include?(request_type)
  id = params.delete(:id)

  uri = id ? URI.parse("#{Api.uri}/#{self.resource_name}/#{id}.json") : URI.parse("#{Api.uri}/#{self.resource_name}.json")

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = uri.scheme == 'https'
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE if !Api.ssl_verify_peer

  request = Net::HTTP.const_get(request_type.capitalize).new(uri.request_uri)
  request.body = JSON.generate(params) unless params.empty?
  request.basic_auth(Api.apikey, "U")
  request["Content-Type"] = "application/json"

  begin
    response = http.request(request)
  rescue Exception => e
    raise e
  end

  response
end
request_200(params={}) click to toggle source
# File lib/copperegg/revealmetrics/mixins/persistence.rb, line 66
def request_200(params={})
  response = request(params)
  unless response.code === "200"
    raise HttpError.new("HTTP request failed with code `#{response.code}`: `#{response.body}`")
  end
  response
end

Private Class Methods

resource(value) click to toggle source
# File lib/copperegg/revealmetrics/mixins/persistence.rb, line 76
def resource(value)
  @resource_name = value
end

Public Instance Methods

delete() click to toggle source
# File lib/copperegg/revealmetrics/mixins/persistence.rb, line 103
def delete
  self.class.request(:id => @id, :request_type => "delete")
end
persisted?() click to toggle source
# File lib/copperegg/revealmetrics/mixins/persistence.rb, line 107
def persisted?
  !@id.nil?
end
save() click to toggle source
# File lib/copperegg/revealmetrics/mixins/persistence.rb, line 89
def save
  if valid?
    response = persisted? ? update : create
    attributes = JSON.parse(response.body)
    if response.code != "200"
      @error = attributes.merge("code" => response.code)
    else
      load_attributes(attributes)
    end
  else
    raise ValidationError.new(@error)
  end
end

Private Instance Methods

create() click to toggle source
# File lib/copperegg/revealmetrics/mixins/persistence.rb, line 113
def create
  self.class.request(to_hash.merge(:request_type => "post"))
end
update() click to toggle source
# File lib/copperegg/revealmetrics/mixins/persistence.rb, line 117
def update
  self.class.request(to_hash.merge(:id => @id, :request_type => "put"))
end