intercom 3.9.4 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/README.md +235 -222
- data/Rakefile +1 -1
- data/changes.txt +6 -0
- data/lib/intercom/api_operations/archive.rb +2 -1
- data/lib/intercom/api_operations/delete.rb +16 -0
- data/lib/intercom/api_operations/find.rb +5 -2
- data/lib/intercom/api_operations/find_all.rb +4 -3
- data/lib/intercom/api_operations/list.rb +4 -1
- data/lib/intercom/api_operations/load.rb +4 -2
- data/lib/intercom/api_operations/nested_resource.rb +70 -0
- data/lib/intercom/api_operations/save.rb +5 -4
- data/lib/intercom/api_operations/scroll.rb +4 -5
- data/lib/intercom/api_operations/search.rb +3 -2
- data/lib/intercom/base_collection_proxy.rb +72 -0
- data/lib/intercom/client.rb +20 -25
- data/lib/intercom/client_collection_proxy.rb +17 -39
- data/lib/intercom/company.rb +8 -0
- data/lib/intercom/contact.rb +21 -3
- data/lib/intercom/conversation.rb +4 -0
- data/lib/intercom/data_attribute.rb +7 -0
- data/lib/intercom/deprecated_leads_collection_proxy.rb +22 -0
- data/lib/intercom/deprecated_resources.rb +13 -0
- data/lib/intercom/errors.rb +3 -0
- data/lib/intercom/extended_api_operations/segments.rb +3 -1
- data/lib/intercom/extended_api_operations/tags.rb +3 -1
- data/lib/intercom/lead.rb +21 -0
- data/lib/intercom/lib/typed_json_deserializer.rb +42 -37
- data/lib/intercom/note.rb +4 -0
- data/lib/intercom/request.rb +37 -33
- data/lib/intercom/scroll_collection_proxy.rb +33 -38
- data/lib/intercom/search_collection_proxy.rb +30 -65
- data/lib/intercom/service/base_service.rb +7 -0
- data/lib/intercom/service/company.rb +0 -12
- data/lib/intercom/service/contact.rb +21 -10
- data/lib/intercom/service/conversation.rb +12 -3
- data/lib/intercom/service/data_attribute.rb +20 -0
- data/lib/intercom/service/lead.rb +41 -0
- data/lib/intercom/service/note.rb +4 -8
- data/lib/intercom/service/subscription.rb +2 -2
- data/lib/intercom/service/tag.rb +9 -9
- data/lib/intercom/service/visitor.rb +17 -8
- data/lib/intercom/tag.rb +4 -0
- data/lib/intercom/traits/api_resource.rb +28 -17
- data/lib/intercom/user.rb +12 -3
- data/lib/intercom/utils.rb +13 -2
- data/lib/intercom/version.rb +1 -1
- data/lib/intercom/visitor.rb +0 -2
- data/lib/intercom.rb +27 -22
- data/spec/spec_helper.rb +738 -513
- data/spec/unit/intercom/admin_spec.rb +2 -2
- data/spec/unit/intercom/base_collection_proxy_spec.rb +30 -0
- data/spec/unit/intercom/client_collection_proxy_spec.rb +41 -41
- data/spec/unit/intercom/client_spec.rb +28 -25
- data/spec/unit/intercom/company_spec.rb +13 -15
- data/spec/unit/intercom/contact_spec.rb +289 -33
- data/spec/unit/intercom/conversation_spec.rb +29 -7
- data/spec/unit/intercom/count_spec.rb +4 -4
- data/spec/unit/intercom/data_attribute_spec.rb +40 -0
- data/spec/unit/intercom/deprecated_leads_collection_proxy_spec.rb +17 -0
- data/spec/unit/intercom/event_spec.rb +9 -11
- data/spec/unit/intercom/job_spec.rb +24 -24
- data/spec/unit/intercom/lead_spec.rb +57 -0
- data/spec/unit/intercom/lib/flat_store_spec.rb +22 -20
- data/spec/unit/intercom/message_spec.rb +1 -1
- data/spec/unit/intercom/note_spec.rb +4 -10
- data/spec/unit/intercom/request_spec.rb +1 -1
- data/spec/unit/intercom/scroll_collection_proxy_spec.rb +40 -39
- data/spec/unit/intercom/search_collection_proxy_spec.rb +32 -28
- data/spec/unit/intercom/segment_spec.rb +2 -2
- data/spec/unit/intercom/subscription_spec.rb +5 -6
- data/spec/unit/intercom/tag_spec.rb +22 -14
- data/spec/unit/intercom/team_spec.rb +2 -2
- data/spec/unit/intercom/traits/api_resource_spec.rb +53 -51
- data/spec/unit/intercom/user_spec.rb +224 -226
- data/spec/unit/intercom/visitor_spec.rb +49 -0
- data/spec/unit/intercom_spec.rb +5 -3
- metadata +22 -7
- data/lib/intercom/customer.rb +0 -10
- data/lib/intercom/service/customer.rb +0 -14
- data/spec/unit/intercom/visitors_spec.rb +0 -61
@@ -1,11 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'intercom/client_collection_proxy'
|
4
|
+
require 'intercom/base_collection_proxy'
|
2
5
|
require 'intercom/utils'
|
3
6
|
|
4
7
|
module Intercom
|
5
8
|
module ApiOperations
|
6
9
|
module List
|
7
10
|
def all
|
8
|
-
|
11
|
+
collection_proxy_class.new(collection_name, collection_class, client: @client)
|
9
12
|
end
|
10
13
|
end
|
11
14
|
end
|
@@ -1,16 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'intercom/utils'
|
2
4
|
|
3
5
|
module Intercom
|
4
6
|
module ApiOperations
|
5
7
|
module Load
|
6
8
|
def load(object)
|
7
|
-
collection_name = Utils.resource_class_to_collection_name(collection_class)
|
8
9
|
if object.id
|
9
10
|
response = @client.get("/#{collection_name}/#{object.id}", {})
|
10
11
|
else
|
11
12
|
raise "Cannot load #{collection_class} as it does not have a valid id."
|
12
13
|
end
|
13
|
-
raise Intercom::HttpError
|
14
|
+
raise Intercom::HttpError, 'Http Error - No response entity returned' unless response
|
15
|
+
|
14
16
|
object.from_response(response)
|
15
17
|
end
|
16
18
|
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Intercom
|
4
|
+
module ApiOperations
|
5
|
+
module NestedResource
|
6
|
+
module ClassMethods
|
7
|
+
def nested_resource_methods(resource,
|
8
|
+
path: nil,
|
9
|
+
operations: nil,
|
10
|
+
resource_plural: nil)
|
11
|
+
resource_plural ||= Utils.pluralize(resource.to_s)
|
12
|
+
path ||= resource_plural
|
13
|
+
raise ArgumentError, 'operations array required' if operations.nil?
|
14
|
+
|
15
|
+
resource_url_method = :"#{resource_plural}_url"
|
16
|
+
|
17
|
+
resource_name = Utils.resource_class_to_collection_name(self)
|
18
|
+
|
19
|
+
define_method(resource_url_method.to_sym) do |id, nested_id = nil|
|
20
|
+
url = "/#{resource_name}/#{id}/#{path}"
|
21
|
+
url += "/#{nested_id}" unless nested_id.nil?
|
22
|
+
url
|
23
|
+
end
|
24
|
+
|
25
|
+
operations.each do |operation|
|
26
|
+
case operation
|
27
|
+
when :create
|
28
|
+
define_method(:"create_#{resource}") do |params|
|
29
|
+
url = send(resource_url_method, self.id)
|
30
|
+
response = client.post(url, params)
|
31
|
+
raise_no_response_error unless response
|
32
|
+
self.class.from_api(response)
|
33
|
+
end
|
34
|
+
when :add
|
35
|
+
define_method(:"add_#{resource}") do |params|
|
36
|
+
url = send(resource_url_method, self.id)
|
37
|
+
response = client.post(url, params)
|
38
|
+
raise_no_response_error unless response
|
39
|
+
self.class.from_api(response)
|
40
|
+
end
|
41
|
+
when :delete
|
42
|
+
define_method(:"remove_#{resource}") do |params|
|
43
|
+
url = send(resource_url_method, self.id, params[:id])
|
44
|
+
response = client.delete(url, params)
|
45
|
+
raise_no_response_error unless response
|
46
|
+
self.class.from_api(response)
|
47
|
+
end
|
48
|
+
when :list
|
49
|
+
define_method(resource_plural.to_sym) do
|
50
|
+
url = send(resource_url_method, self.id)
|
51
|
+
resource_class = Utils.constantize_resource_name(resource.to_s)
|
52
|
+
resource_class.collection_proxy_class.new(resource_plural, resource_class, details: { url: url }, client: client)
|
53
|
+
end
|
54
|
+
else
|
55
|
+
raise ArgumentError, "Unknown operation: #{operation.inspect}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.included(base)
|
62
|
+
base.extend(ClassMethods)
|
63
|
+
end
|
64
|
+
|
65
|
+
private def raise_no_response_error
|
66
|
+
raise Intercom::HttpError, 'Http Error - No response entity returned'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'intercom/utils'
|
2
4
|
require 'ext/sliceable_hash'
|
3
5
|
|
@@ -8,8 +10,8 @@ module Intercom
|
|
8
10
|
private_constant :PARAMS_NOT_PROVIDED
|
9
11
|
|
10
12
|
def create(params = PARAMS_NOT_PROVIDED)
|
11
|
-
if collection_class.ancestors.include?(Intercom::
|
12
|
-
params =
|
13
|
+
if collection_class.ancestors.include?(Intercom::Lead) && params == PARAMS_NOT_PROVIDED
|
14
|
+
params = {}
|
13
15
|
elsif params == PARAMS_NOT_PROVIDED
|
14
16
|
raise ArgumentError, '.create requires 1 parameter'
|
15
17
|
end
|
@@ -20,7 +22,6 @@ module Intercom
|
|
20
22
|
end
|
21
23
|
|
22
24
|
def save(object)
|
23
|
-
collection_name = Utils.resource_class_to_collection_name(collection_class)
|
24
25
|
if id_present?(object) && !posted_updates?(object)
|
25
26
|
response = @client.put("/#{collection_name}/#{object.id}", object.to_submittable_hash)
|
26
27
|
else
|
@@ -30,7 +31,7 @@ module Intercom
|
|
30
31
|
end
|
31
32
|
|
32
33
|
def identity_hash(object)
|
33
|
-
object.respond_to?(:identity_vars) ? SliceableHash.new(object.to_hash).slice(*
|
34
|
+
object.respond_to?(:identity_vars) ? SliceableHash.new(object.to_hash).slice(*object.identity_vars.map(&:to_s)) : {}
|
34
35
|
end
|
35
36
|
|
36
37
|
private
|
@@ -1,17 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'intercom/scroll_collection_proxy'
|
2
4
|
require 'intercom/utils'
|
3
5
|
|
4
6
|
module Intercom
|
5
7
|
module ApiOperations
|
6
8
|
module Scroll
|
7
|
-
|
8
|
-
def scroll()
|
9
|
-
collection_name = Utils.resource_class_to_collection_name(collection_class)
|
9
|
+
def scroll
|
10
10
|
finder_details = {}
|
11
11
|
finder_details[:url] = "/#{collection_name}"
|
12
|
-
ScrollCollectionProxy.new(collection_name,
|
12
|
+
ScrollCollectionProxy.new(collection_name, collection_class, details: finder_details, client: @client)
|
13
13
|
end
|
14
|
-
|
15
14
|
end
|
16
15
|
end
|
17
16
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'intercom/search_collection_proxy'
|
2
4
|
require 'intercom/utils'
|
3
5
|
|
@@ -5,12 +7,11 @@ module Intercom
|
|
5
7
|
module ApiOperations
|
6
8
|
module Search
|
7
9
|
def search(params)
|
8
|
-
collection_name = Utils.resource_class_to_collection_name(collection_class)
|
9
10
|
search_details = {
|
10
11
|
url: "/#{collection_name}/search",
|
11
12
|
params: params
|
12
13
|
}
|
13
|
-
SearchCollectionProxy.new(collection_name,
|
14
|
+
SearchCollectionProxy.new(collection_name, collection_class, details: search_details, client: @client)
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'intercom/utils'
|
4
|
+
|
5
|
+
module Intercom
|
6
|
+
class BaseCollectionProxy
|
7
|
+
attr_reader :resource_name, :url, :resource_class
|
8
|
+
|
9
|
+
def initialize(resource_name, resource_class, details: {}, client:, method: 'get')
|
10
|
+
@resource_name = resource_name
|
11
|
+
@resource_class = resource_class
|
12
|
+
@url = (details[:url] || "/#{@resource_name}")
|
13
|
+
@params = (details[:params] || {})
|
14
|
+
@client = client
|
15
|
+
@method = method
|
16
|
+
end
|
17
|
+
|
18
|
+
def each(&block)
|
19
|
+
loop do
|
20
|
+
response_hash = @client.public_send(@method, @url, payload)
|
21
|
+
raise Intercom::HttpError, 'Http Error - No response entity returned' unless response_hash
|
22
|
+
|
23
|
+
deserialize_response_hash(response_hash, block)
|
24
|
+
break unless has_next_link?(response_hash)
|
25
|
+
end
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def [](target_index)
|
30
|
+
each_with_index do |item, index|
|
31
|
+
return item if index == target_index
|
32
|
+
end
|
33
|
+
nil
|
34
|
+
end
|
35
|
+
|
36
|
+
include Enumerable
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def deserialize_response_hash(response_hash, block)
|
41
|
+
top_level_type = response_hash.delete('type')
|
42
|
+
top_level_entity_key = if resource_name == 'subscriptions'
|
43
|
+
'items'
|
44
|
+
else
|
45
|
+
Utils.entity_key_from_type(top_level_type)
|
46
|
+
end
|
47
|
+
response_hash[top_level_entity_key].each do |object_json|
|
48
|
+
block.call Lib::TypedJsonDeserializer.new(object_json, @client).deserialize
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def has_next_link?(response_hash)
|
53
|
+
paging_info = response_hash.delete('pages')
|
54
|
+
return false unless paging_info
|
55
|
+
|
56
|
+
paging_next = paging_info['next']
|
57
|
+
if paging_next
|
58
|
+
@params[:starting_after] = paging_next['starting_after']
|
59
|
+
return true
|
60
|
+
else
|
61
|
+
return false
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def payload
|
66
|
+
payload = {}
|
67
|
+
payload[:per_page] = @params[:per_page] if @params[:per_page]
|
68
|
+
payload[:starting_after] = @params[:starting_after] if @params[:starting_after]
|
69
|
+
payload
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/intercom/client.rb
CHANGED
@@ -1,38 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Intercom
|
2
4
|
class MisconfiguredClientError < StandardError; end
|
3
5
|
class Client
|
4
6
|
include Options
|
5
|
-
|
7
|
+
include DeprecatedResources
|
8
|
+
attr_reader :base_url, :rate_limit_details, :token, :handle_rate_limit, :timeouts, :api_version
|
6
9
|
|
7
10
|
class << self
|
8
11
|
def set_base_url(base_url)
|
9
|
-
|
12
|
+
proc do |o|
|
10
13
|
old_url = o.base_url
|
11
14
|
o.send(:base_url=, base_url)
|
12
|
-
|
15
|
+
proc { |_obj| set_base_url(old_url).call(o) }
|
13
16
|
end
|
14
17
|
end
|
15
18
|
|
16
19
|
def set_timeouts(open_timeout: nil, read_timeout: nil)
|
17
|
-
|
20
|
+
proc do |o|
|
18
21
|
old_timeouts = o.timeouts
|
19
22
|
timeouts = {}
|
20
23
|
timeouts[:open_timeout] = open_timeout if open_timeout
|
21
24
|
timeouts[:read_timeout] = read_timeout if read_timeout
|
22
25
|
o.send(:timeouts=, timeouts)
|
23
|
-
|
26
|
+
proc { |_obj| set_timeouts(old_timeouts).call(o) }
|
24
27
|
end
|
25
28
|
end
|
26
29
|
end
|
27
30
|
|
28
|
-
def initialize(
|
29
|
-
|
30
|
-
@username_part = token
|
31
|
-
@password_part = ""
|
32
|
-
else
|
33
|
-
@username_part = app_id
|
34
|
-
@password_part = api_key
|
35
|
-
end
|
31
|
+
def initialize(token: nil, base_url: 'https://api.intercom.io', handle_rate_limit: false, api_version: nil)
|
32
|
+
@token = token
|
36
33
|
validate_credentials!
|
37
34
|
|
38
35
|
@api_version = api_version
|
@@ -67,10 +64,6 @@ module Intercom
|
|
67
64
|
Intercom::Service::Counts.new(self)
|
68
65
|
end
|
69
66
|
|
70
|
-
def customers
|
71
|
-
Intercom::Service::Customer.new(self)
|
72
|
-
end
|
73
|
-
|
74
67
|
def events
|
75
68
|
Intercom::Service::Event.new(self)
|
76
69
|
end
|
@@ -111,6 +104,10 @@ module Intercom
|
|
111
104
|
Intercom::Service::Job.new(self)
|
112
105
|
end
|
113
106
|
|
107
|
+
def data_attributes
|
108
|
+
Intercom::Service::DataAttribute.new(self)
|
109
|
+
end
|
110
|
+
|
114
111
|
def get(path, params)
|
115
112
|
execute_request Intercom::Request.get(path, params)
|
116
113
|
end
|
@@ -130,25 +127,23 @@ module Intercom
|
|
130
127
|
private
|
131
128
|
|
132
129
|
def validate_credentials!
|
133
|
-
error = MisconfiguredClientError.new(
|
134
|
-
|
130
|
+
error = MisconfiguredClientError.new('an access token must be provided')
|
131
|
+
raise error if @token.nil?
|
135
132
|
end
|
136
133
|
|
137
134
|
def validate_api_version!
|
138
|
-
error = MisconfiguredClientError.new(
|
139
|
-
|
135
|
+
error = MisconfiguredClientError.new('api_version must be either nil or a valid API version')
|
136
|
+
raise error if @api_version && @api_version != 'Unstable' && Gem::Version.new(@api_version) < Gem::Version.new('1.0')
|
140
137
|
end
|
141
138
|
|
142
139
|
def execute_request(request)
|
143
140
|
request.handle_rate_limit = handle_rate_limit
|
144
|
-
request.execute(@base_url,
|
141
|
+
request.execute(@base_url, token: @token, api_version: @api_version, **timeouts)
|
145
142
|
ensure
|
146
143
|
@rate_limit_details = request.rate_limit_details
|
147
144
|
end
|
148
145
|
|
149
|
-
|
150
|
-
@base_url = new_url
|
151
|
-
end
|
146
|
+
attr_writer :base_url
|
152
147
|
|
153
148
|
def timeouts=(timeouts)
|
154
149
|
@timeouts = @timeouts.merge(timeouts)
|
@@ -1,71 +1,49 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
attr_reader :resource_name, :finder_url, :resource_class
|
7
|
-
|
8
|
-
def initialize(resource_name, finder_details: {}, client:)
|
9
|
-
@resource_name = resource_name
|
10
|
-
@resource_class = Utils.constantize_resource_name(resource_name)
|
11
|
-
@finder_url = (finder_details[:url] || "/#{@resource_name}")
|
12
|
-
@finder_params = (finder_details[:params] || {})
|
13
|
-
@client = client
|
14
|
-
end
|
3
|
+
require 'intercom/utils'
|
4
|
+
require 'intercom/base_collection_proxy'
|
15
5
|
|
6
|
+
module Intercom
|
7
|
+
class ClientCollectionProxy < BaseCollectionProxy
|
16
8
|
def each(&block)
|
17
9
|
next_page = nil
|
18
10
|
current_page = nil
|
19
11
|
loop do
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
response_hash = @client.get(@finder_url, @finder_params)
|
24
|
-
end
|
25
|
-
raise Intercom::HttpError.new('Http Error - No response entity returned') unless response_hash
|
12
|
+
response_hash = fetch(next_page)
|
13
|
+
raise Intercom::HttpError, 'Http Error - No response entity returned' unless response_hash
|
14
|
+
|
26
15
|
current_page = extract_current_page(response_hash)
|
27
16
|
deserialize_response_hash(response_hash, block)
|
28
17
|
next_page = extract_next_link(response_hash)
|
29
|
-
break if next_page.nil?
|
18
|
+
break if next_page.nil? || (@params[:page] && (current_page >= @params[:page]))
|
30
19
|
end
|
31
20
|
self
|
32
21
|
end
|
33
22
|
|
34
|
-
def
|
35
|
-
|
36
|
-
|
23
|
+
def fetch(next_page)
|
24
|
+
if next_page
|
25
|
+
@client.get(next_page, {})
|
26
|
+
else
|
27
|
+
@client.get(@url, @params)
|
37
28
|
end
|
38
|
-
nil
|
39
29
|
end
|
40
30
|
|
41
|
-
include Enumerable
|
42
|
-
|
43
31
|
private
|
44
32
|
|
45
|
-
def deserialize_response_hash(response_hash, block)
|
46
|
-
top_level_type = response_hash.delete('type')
|
47
|
-
if resource_name == 'subscriptions'
|
48
|
-
top_level_entity_key = 'items'
|
49
|
-
else
|
50
|
-
top_level_entity_key = Utils.entity_key_from_type(top_level_type)
|
51
|
-
end
|
52
|
-
response_hash[top_level_entity_key].each do |object_json|
|
53
|
-
block.call Lib::TypedJsonDeserializer.new(object_json).deserialize
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
33
|
def paging_info_present?(response_hash)
|
58
34
|
!!(response_hash['pages'] && response_hash['pages']['type'])
|
59
35
|
end
|
60
36
|
|
61
37
|
def extract_next_link(response_hash)
|
62
38
|
return nil unless paging_info_present?(response_hash)
|
39
|
+
|
63
40
|
paging_info = response_hash.delete('pages')
|
64
|
-
paging_info[
|
41
|
+
paging_info['next']
|
65
42
|
end
|
66
43
|
|
67
44
|
def extract_current_page(response_hash)
|
68
45
|
return nil unless paging_info_present?(response_hash)
|
46
|
+
|
69
47
|
response_hash['pages']['page']
|
70
48
|
end
|
71
49
|
end
|
data/lib/intercom/company.rb
CHANGED
@@ -1,10 +1,18 @@
|
|
1
1
|
require 'intercom/traits/incrementable_attributes'
|
2
2
|
require 'intercom/traits/api_resource'
|
3
|
+
require 'intercom/api_operations/nested_resource'
|
3
4
|
|
4
5
|
module Intercom
|
5
6
|
class Company
|
6
7
|
include Traits::IncrementableAttributes
|
7
8
|
include Traits::ApiResource
|
9
|
+
include ApiOperations::NestedResource
|
10
|
+
|
11
|
+
nested_resource_methods :contact, operations: %i[list]
|
12
|
+
|
13
|
+
def self.collection_proxy_class
|
14
|
+
Intercom::ClientCollectionProxy
|
15
|
+
end
|
8
16
|
|
9
17
|
def identity_vars ; [:id, :company_id] ; end
|
10
18
|
def flat_store_attributes ; [:custom_attributes] ; end
|
data/lib/intercom/contact.rb
CHANGED
@@ -1,11 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'intercom/traits/incrementable_attributes'
|
1
4
|
require 'intercom/traits/api_resource'
|
5
|
+
require 'intercom/api_operations/nested_resource'
|
2
6
|
|
3
7
|
module Intercom
|
4
8
|
class Contact
|
9
|
+
include Traits::IncrementableAttributes
|
5
10
|
include Traits::ApiResource
|
11
|
+
include ApiOperations::NestedResource
|
12
|
+
|
13
|
+
nested_resource_methods :tag, operations: %i[add delete list]
|
14
|
+
nested_resource_methods :note, operations: %i[create list]
|
15
|
+
nested_resource_methods :company, operations: %i[add delete list]
|
16
|
+
|
17
|
+
def self.collection_proxy_class
|
18
|
+
Intercom::BaseCollectionProxy
|
19
|
+
end
|
20
|
+
|
21
|
+
def identity_vars
|
22
|
+
[:id]
|
23
|
+
end
|
6
24
|
|
7
|
-
def
|
8
|
-
|
9
|
-
|
25
|
+
def flat_store_attributes
|
26
|
+
[:custom_attributes]
|
27
|
+
end
|
10
28
|
end
|
11
29
|
end
|
@@ -1,7 +1,11 @@
|
|
1
1
|
require 'intercom/traits/api_resource'
|
2
|
+
require 'intercom/api_operations/nested_resource'
|
2
3
|
|
3
4
|
module Intercom
|
4
5
|
class Conversation
|
5
6
|
include Traits::ApiResource
|
7
|
+
include ApiOperations::NestedResource
|
8
|
+
|
9
|
+
nested_resource_methods :tag, operations: %i[add delete]
|
6
10
|
end
|
7
11
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Intercom
|
4
|
+
class DeprecatedLeadsCollectionProxy < ClientCollectionProxy
|
5
|
+
def fetch(next_page)
|
6
|
+
response_hash = if next_page
|
7
|
+
@client.get(next_page, {})
|
8
|
+
else
|
9
|
+
@client.get(@url, @params)
|
10
|
+
end
|
11
|
+
transform(response_hash)
|
12
|
+
end
|
13
|
+
|
14
|
+
def transform(response_hash)
|
15
|
+
response_hash['type'] = 'lead.list'
|
16
|
+
leads_list = response_hash.delete('contacts')
|
17
|
+
leads_list.each { |lead| lead['type'] = 'lead' }
|
18
|
+
response_hash['leads'] = leads_list
|
19
|
+
response_hash
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/intercom/errors.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'intercom/client_collection_proxy'
|
2
4
|
require 'intercom/utils'
|
3
5
|
|
@@ -6,7 +8,7 @@ module Intercom
|
|
6
8
|
module Segments
|
7
9
|
def by_segment(id)
|
8
10
|
collection_name = Utils.resource_class_to_collection_name(collection_class)
|
9
|
-
ClientCollectionProxy.new(collection_name,
|
11
|
+
ClientCollectionProxy.new(collection_name, collection_class, details: { url: "/#{collection_name}?segment_id=#{id}" }, client: @client)
|
10
12
|
end
|
11
13
|
end
|
12
14
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'intercom/client_collection_proxy'
|
2
4
|
require 'intercom/utils'
|
3
5
|
|
@@ -6,7 +8,7 @@ module Intercom
|
|
6
8
|
module Tags
|
7
9
|
def by_tag(id)
|
8
10
|
collection_name = Utils.resource_class_to_collection_name(collection_class)
|
9
|
-
ClientCollectionProxy.new(collection_name,
|
11
|
+
ClientCollectionProxy.new(collection_name, collection_class, details: { url: "/#{collection_name}?tag_id=#{id}" }, client: @client)
|
10
12
|
end
|
11
13
|
end
|
12
14
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'intercom/traits/api_resource'
|
4
|
+
|
5
|
+
module Intercom
|
6
|
+
class Lead
|
7
|
+
include Traits::ApiResource
|
8
|
+
|
9
|
+
def identity_vars
|
10
|
+
%i[email user_id]
|
11
|
+
end
|
12
|
+
|
13
|
+
def flat_store_attributes
|
14
|
+
[:custom_attributes]
|
15
|
+
end
|
16
|
+
|
17
|
+
def update_verb
|
18
|
+
'put'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|