Skip to content

Commit c106b8a

Browse files
author
Skaelv
committed
visitor endpoint
1 parent c4cf9c6 commit c106b8a

File tree

6 files changed

+133
-9
lines changed

6 files changed

+133
-9
lines changed

lib/intercom.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
require 'intercom/service/segment'
1313
require 'intercom/service/tag'
1414
require 'intercom/service/user'
15+
require 'intercom/service/visitor'
1516
require 'intercom/options'
1617
require 'intercom/client'
1718
require "intercom/contact"
@@ -30,6 +31,7 @@
3031
require "intercom/subscription"
3132
require "intercom/utils"
3233
require "intercom/errors"
34+
require "intercom/visitor"
3335
require "json"
3436

3537
##

lib/intercom/api_operations/convert.rb

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,33 @@
33
module Intercom
44
module ApiOperations
55
module Convert
6-
def convert(contact, user)
7-
Intercom::User.new.from_response(
8-
@client.post(
9-
"/contacts/convert",
10-
{
11-
contact: { user_id: contact.user_id },
12-
user: identity_hash(user)
13-
}
6+
def convert(contact, user = false)
7+
if contact.class == Intercom::Visitor
8+
visitor = contact
9+
req = {
10+
visitor: { user_id: visitor.user_id },
11+
}
12+
if user
13+
req[:user] = identity_hash(user)
14+
req[:type] = 'user'
15+
else
16+
req[:type] = 'lead'
17+
end
18+
Intercom::User.new.from_response(
19+
@client.post(
20+
"/visitors/convert", req
21+
)
1422
)
15-
)
23+
else
24+
Intercom::User.new.from_response(
25+
@client.post(
26+
"/contacts/convert", {
27+
contact: { user_id: contact.user_id },
28+
user: identity_hash(user)
29+
}
30+
)
31+
)
32+
end
1633
end
1734
end
1835
end

lib/intercom/client.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ def users
7676
Intercom::Service::User.new(self)
7777
end
7878

79+
def visitors
80+
Intercom::Service::Visitor.new(self)
81+
end
82+
7983
def jobs
8084
Intercom::Service::Job.new(self)
8185
end

lib/intercom/service/visitor.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
require 'intercom/service/base_service'
2+
require 'intercom/api_operations/load'
3+
require 'intercom/api_operations/list'
4+
require 'intercom/api_operations/find'
5+
require 'intercom/api_operations/find_all'
6+
require 'intercom/api_operations/save'
7+
require 'intercom/api_operations/convert'
8+
require 'intercom/api_operations/delete'
9+
10+
module Intercom
11+
module Service
12+
class Visitor < BaseService
13+
include ApiOperations::Load
14+
include ApiOperations::List
15+
include ApiOperations::Find
16+
include ApiOperations::FindAll
17+
include ApiOperations::Save
18+
include ApiOperations::Convert
19+
include ApiOperations::Delete
20+
21+
def collection_class
22+
Intercom::Visitor
23+
end
24+
end
25+
end
26+
end

lib/intercom/visitor.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
require 'intercom/traits/incrementable_attributes'
2+
require 'intercom/traits/api_resource'
3+
4+
module Intercom
5+
class Visitor
6+
include Traits::IncrementableAttributes
7+
include Traits::ApiResource
8+
9+
def identity_vars ; [:id, :email, :user_id] ; end
10+
def flat_store_attributes ; [:custom_attributes] ; end
11+
def update_verb ; 'put' ; end
12+
13+
end
14+
end
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
require "spec_helper"
2+
3+
describe "Intercom::Visitors" do
4+
let (:client) { Intercom::Client.new(app_id: 'app_id', api_key: 'api_key') }
5+
6+
it 'should be listable' do
7+
proxy = client.visitors.all
8+
proxy.resource_name.must_equal 'visitors'
9+
proxy.finder_url.must_equal '/visitors'
10+
proxy.resource_class.must_equal Intercom::Visitor
11+
end
12+
13+
it 'can update a visitor with an id' do
14+
visitor = Intercom::Visitor.new(:id => "de45ae78gae1289cb")
15+
client.expects(:put).with("/visitors/de45ae78gae1289cb", {'custom_attributes' => {}})
16+
client.visitors.save(visitor)
17+
end
18+
19+
describe 'converting' do
20+
let(:visitor) { Intercom::Visitor.from_api(user_id: 'visitor_id') }
21+
let(:user) { Intercom::User.from_api(id: 'user_id') }
22+
23+
it 'visitor to user' do
24+
client.expects(:post).with(
25+
"/visitors/convert",
26+
{
27+
visitor: { user_id: visitor.user_id },
28+
user: { 'id' => user.id },
29+
type:'user'
30+
}
31+
).returns(test_user)
32+
33+
client.visitors.convert(visitor, user)
34+
end
35+
36+
it 'visitor to lead' do
37+
client.expects(:post).with(
38+
"/visitors/convert",
39+
{
40+
visitor: { user_id: visitor.user_id },
41+
type:'lead'
42+
}
43+
).returns(test_user)
44+
45+
client.visitors.convert(visitor)
46+
end
47+
end
48+
49+
it "returns a ClientCollectionProxy for all without making any requests" do
50+
client.expects(:execute_request).never
51+
all = client.visitors.all
52+
all.must_be_instance_of(Intercom::ClientCollectionProxy)
53+
end
54+
55+
it "deletes a visitor" do
56+
visitor = Intercom::Visitor.new("id" => "1")
57+
client.expects(:delete).with("/visitors/1", {}).returns(visitor)
58+
client.visitors.delete(visitor)
59+
end
60+
61+
end

0 commit comments

Comments
 (0)