Skip to content

Commit 1910189

Browse files
committed
Merge pull request #201 from intercom/RuairiK/bulk_api
Bulk API support
2 parents 0d113bd + 6f0a53c commit 1910189

File tree

12 files changed

+324
-2
lines changed

12 files changed

+324
-2
lines changed

lib/intercom.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
require 'intercom/service/event'
88
require 'intercom/service/message'
99
require 'intercom/service/note'
10+
require 'intercom/service/job'
1011
require 'intercom/service/subscription'
1112
require 'intercom/service/segment'
1213
require 'intercom/service/tag'
@@ -18,6 +19,7 @@
1819
require "intercom/user"
1920
require "intercom/company"
2021
require "intercom/note"
22+
require "intercom/job"
2123
require "intercom/tag"
2224
require "intercom/segment"
2325
require "intercom/event"
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module Intercom
2+
module ApiOperations
3+
module Bulk
4+
module LoadErrorFeed
5+
def errors(params)
6+
response = @client.get("/jobs/#{params.fetch(:id)}/error", {})
7+
raise Intercom::HttpError.new('Http Error - No response entity returned') unless response
8+
from_api(response)
9+
end
10+
end
11+
end
12+
end
13+
end
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
module Intercom
2+
module ApiOperations
3+
module Bulk
4+
module Submit
5+
def submit_bulk_job(params)
6+
raise(ArgumentError, "events do not support bulk delete operations") if collection_class == Intercom::Event && !params.fetch(:delete_items, []).empty?
7+
data_type = Utils.resource_class_to_singular_name(collection_class)
8+
collection_name = Utils.resource_class_to_collection_name(collection_class)
9+
create_items = params.fetch(:create_items, []).map { |item| item_for_api("post", data_type, item) }
10+
delete_items = params.fetch(:delete_items, []).map { |item| item_for_api("delete", data_type, item) }
11+
existing_job_id = params.fetch(:job_id, '')
12+
13+
bulk_request = {
14+
items: create_items + delete_items
15+
}
16+
bulk_request[:job] = { id: existing_job_id } unless existing_job_id.empty?
17+
18+
response = @client.post("/bulk/#{collection_name}", bulk_request)
19+
raise Intercom::HttpError.new('Http Error - No response entity returned') unless response
20+
Intercom::Job.new.from_response(response)
21+
end
22+
23+
private
24+
25+
def item_for_api(method, data_type, item)
26+
{
27+
method: method,
28+
data_type: data_type,
29+
data: item
30+
}
31+
end
32+
end
33+
end
34+
end
35+
end

lib/intercom/client.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ def users
6868
Intercom::Service::User.new(self)
6969
end
7070

71+
def jobs
72+
Intercom::Service::Job.new(self)
73+
end
74+
7175
def get(path, params)
7276
execute_request Intercom::Request.get(path, params)
7377
end

lib/intercom/job.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
require 'intercom/traits/api_resource'
2+
3+
module Intercom
4+
class Job
5+
include Traits::ApiResource
6+
end
7+
end

lib/intercom/lib/dynamic_accessors_on_method_missing.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ def trying_to_access_private_variable?
4545
end
4646

4747
def trying_to_access_print_method?
48-
[:to_ary, :to_s].include? method_sym
49-
end
48+
[:to_ary, :to_s].include? method_sym
49+
end
5050

5151
def attribute_not_set_error_message
5252
"'#{method_string}' called on #{klass} but it has not been set an " +

lib/intercom/service/event.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
require 'intercom/service/base_service'
22
require 'intercom/api_operations/save'
3+
require 'intercom/api_operations/bulk/submit'
34

45
module Intercom
56
module Service
67
class Event < BaseService
78
include ApiOperations::Save
9+
include ApiOperations::Bulk::Submit
810

911
def collection_class
1012
Intercom::Event

lib/intercom/service/job.rb

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

lib/intercom/service/user.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
require 'intercom/api_operations/find_all'
66
require 'intercom/api_operations/save'
77
require 'intercom/api_operations/delete'
8+
require 'intercom/api_operations/bulk/submit'
89
require 'intercom/extended_api_operations/tags'
910
require 'intercom/extended_api_operations/segments'
1011

@@ -17,6 +18,7 @@ class User < BaseService
1718
include ApiOperations::FindAll
1819
include ApiOperations::Save
1920
include ApiOperations::Delete
21+
include ApiOperations::Bulk::Submit
2022
include ExtendedApiOperations::Tags
2123
include ExtendedApiOperations::Segments
2224

spec/unit/intercom/event_spec.rb

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,105 @@
2323
client.events.create(:event_name => "sale of item", :email => '[email protected]')
2424
end
2525

26+
describe 'bulk operations' do
27+
let (:job) {
28+
{
29+
"app_id"=>"app_id",
30+
"id"=>"super_awesome_job",
31+
"created_at"=>1446033421,
32+
"completed_at"=>1446048736,
33+
"closing_at"=>1446034321,
34+
"updated_at"=>1446048736,
35+
"name"=>"api_bulk_job",
36+
"state"=>"completed",
37+
"links"=>
38+
{
39+
"error"=>"https://api.intercom.io/jobs/super_awesome_job/error",
40+
"self"=>"https://api.intercom.io/jobs/super_awesome_job"
41+
},
42+
"tasks"=>
43+
[
44+
{
45+
"id"=>"super_awesome_task",
46+
"item_count"=>2,
47+
"created_at"=>1446033421,
48+
"started_at"=>1446033709,
49+
"completed_at"=>1446033709,
50+
"state"=>"completed"
51+
}
52+
]
53+
}
54+
}
55+
let(:bulk_request) {
56+
{
57+
items: [
58+
{
59+
method: "post",
60+
data_type: "event",
61+
data:{
62+
event_name: "ordered-item",
63+
created_at: 1438944980,
64+
user_id: "314159",
65+
metadata: {
66+
order_date: 1438944980,
67+
stripe_invoice: "inv_3434343434"
68+
}
69+
}
70+
},
71+
{
72+
method: "post",
73+
data_type: "event",
74+
data:{
75+
event_name: "invited-friend",
76+
created_at: 1438944979,
77+
user_id: "314159",
78+
metadata: {
79+
invitee_email: "[email protected]",
80+
invite_code: "ADDAFRIEND"
81+
}
82+
}
83+
}
84+
]
85+
}
86+
}
87+
let(:events) {
88+
[
89+
{
90+
event_name: "ordered-item",
91+
created_at: 1438944980,
92+
user_id: "314159",
93+
metadata: {
94+
order_date: 1438944980,
95+
stripe_invoice: "inv_3434343434"
96+
}
97+
},
98+
{
99+
event_name: "invited-friend",
100+
created_at: 1438944979,
101+
user_id: "314159",
102+
metadata: {
103+
invitee_email: "[email protected]",
104+
invite_code: "ADDAFRIEND"
105+
}
106+
}
107+
]
108+
}
109+
110+
it "submits a bulk job" do
111+
client.expects(:post).with("/bulk/events", bulk_request).returns(job)
112+
client.events.submit_bulk_job(create_items: events)
113+
end
114+
115+
it "adds events to an existing bulk job" do
116+
bulk_request[:job] = {id: 'super_awesome_job'}
117+
client.expects(:post).with("/bulk/events", bulk_request).returns(job)
118+
client.events.submit_bulk_job(create_items: events, job_id: 'super_awesome_job')
119+
end
120+
121+
it "does not submit delete jobs" do
122+
lambda { client.events.submit_bulk_job(delete_items: events) }.must_raise ArgumentError
123+
end
124+
125+
end
126+
26127
end

0 commit comments

Comments
 (0)