Skip to content

Commit

Permalink
Merge pull request #242 from intercom/Skaelv/visitors_endpoint
Browse files Browse the repository at this point in the history
visitor endpoint
  • Loading branch information
Antoine Kevin committed Apr 26, 2016
2 parents c4cf9c6 + c106b8a commit 4641787
Show file tree
Hide file tree
Showing 6 changed files with 133 additions and 9 deletions.
2 changes: 2 additions & 0 deletions lib/intercom.rb
Expand Up @@ -12,6 +12,7 @@
require 'intercom/service/segment'
require 'intercom/service/tag'
require 'intercom/service/user'
require 'intercom/service/visitor'
require 'intercom/options'
require 'intercom/client'
require "intercom/contact"
Expand All @@ -30,6 +31,7 @@
require "intercom/subscription"
require "intercom/utils"
require "intercom/errors"
require "intercom/visitor"
require "json"

##
Expand Down
35 changes: 26 additions & 9 deletions lib/intercom/api_operations/convert.rb
Expand Up @@ -3,16 +3,33 @@
module Intercom
module ApiOperations
module Convert
def convert(contact, user)
Intercom::User.new.from_response(
@client.post(
"/contacts/convert",
{
contact: { user_id: contact.user_id },
user: identity_hash(user)
}
def convert(contact, user = false)
if contact.class == Intercom::Visitor
visitor = contact
req = {
visitor: { user_id: visitor.user_id },
}
if user
req[:user] = identity_hash(user)
req[:type] = 'user'
else
req[:type] = 'lead'
end
Intercom::User.new.from_response(
@client.post(
"/visitors/convert", req
)
)
)
else
Intercom::User.new.from_response(
@client.post(
"/contacts/convert", {
contact: { user_id: contact.user_id },
user: identity_hash(user)
}
)
)
end
end
end
end
Expand Down
4 changes: 4 additions & 0 deletions lib/intercom/client.rb
Expand Up @@ -76,6 +76,10 @@ def users
Intercom::Service::User.new(self)
end

def visitors
Intercom::Service::Visitor.new(self)
end

def jobs
Intercom::Service::Job.new(self)
end
Expand Down
26 changes: 26 additions & 0 deletions lib/intercom/service/visitor.rb
@@ -0,0 +1,26 @@
require 'intercom/service/base_service'
require 'intercom/api_operations/load'
require 'intercom/api_operations/list'
require 'intercom/api_operations/find'
require 'intercom/api_operations/find_all'
require 'intercom/api_operations/save'
require 'intercom/api_operations/convert'
require 'intercom/api_operations/delete'

module Intercom
module Service
class Visitor < BaseService
include ApiOperations::Load
include ApiOperations::List
include ApiOperations::Find
include ApiOperations::FindAll
include ApiOperations::Save
include ApiOperations::Convert
include ApiOperations::Delete

def collection_class
Intercom::Visitor
end
end
end
end
14 changes: 14 additions & 0 deletions lib/intercom/visitor.rb
@@ -0,0 +1,14 @@
require 'intercom/traits/incrementable_attributes'
require 'intercom/traits/api_resource'

module Intercom
class Visitor
include Traits::IncrementableAttributes
include Traits::ApiResource

def identity_vars ; [:id, :email, :user_id] ; end
def flat_store_attributes ; [:custom_attributes] ; end
def update_verb ; 'put' ; end

end
end
61 changes: 61 additions & 0 deletions spec/unit/intercom/visitors_spec.rb
@@ -0,0 +1,61 @@
require "spec_helper"

describe "Intercom::Visitors" do
let (:client) { Intercom::Client.new(app_id: 'app_id', api_key: 'api_key') }

it 'should be listable' do
proxy = client.visitors.all
proxy.resource_name.must_equal 'visitors'
proxy.finder_url.must_equal '/visitors'
proxy.resource_class.must_equal Intercom::Visitor
end

it 'can update a visitor with an id' do
visitor = Intercom::Visitor.new(:id => "de45ae78gae1289cb")
client.expects(:put).with("/visitors/de45ae78gae1289cb", {'custom_attributes' => {}})
client.visitors.save(visitor)
end

describe 'converting' do
let(:visitor) { Intercom::Visitor.from_api(user_id: 'visitor_id') }
let(:user) { Intercom::User.from_api(id: 'user_id') }

it 'visitor to user' do
client.expects(:post).with(
"/visitors/convert",
{
visitor: { user_id: visitor.user_id },
user: { 'id' => user.id },
type:'user'
}
).returns(test_user)

client.visitors.convert(visitor, user)
end

it 'visitor to lead' do
client.expects(:post).with(
"/visitors/convert",
{
visitor: { user_id: visitor.user_id },
type:'lead'
}
).returns(test_user)

client.visitors.convert(visitor)
end
end

it "returns a ClientCollectionProxy for all without making any requests" do
client.expects(:execute_request).never
all = client.visitors.all
all.must_be_instance_of(Intercom::ClientCollectionProxy)
end

it "deletes a visitor" do
visitor = Intercom::Visitor.new("id" => "1")
client.expects(:delete).with("/visitors/1", {}).returns(visitor)
client.visitors.delete(visitor)
end

end

0 comments on commit 4641787

Please sign in to comment.