Skip to content

Commit 3c40874

Browse files
Merge pull request #25 from untitledstartup/gmartini/BAN-8680-add-bulk-remove-tag-from-subscriber
Gmartini/ban 8680 add bulk remove tag from subscriber
2 parents 76426c5 + 0f6d498 commit 3c40874

File tree

6 files changed

+119
-8
lines changed

6 files changed

+119
-8
lines changed

lib/convertkit.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@
1919
require 'convertkit/resources/sequence_response'
2020
require 'convertkit/resources/sequences'
2121
require 'convertkit/resources/subscriber_response'
22+
require 'convertkit/resources/subscriber_bulk_add_tag_response'
2223
require 'convertkit/resources/subscriber_bulk_create_response'
2324
require 'convertkit/resources/subscriber_bulk_create_failure_response'
24-
require 'convertkit/resources/subscriber_bulk_tag_response'
25+
require 'convertkit/resources/subscriber_bulk_remove_tag_response'
26+
require 'convertkit/resources/subscriber_bulk_tag_failure_response'
2527
require 'convertkit/resources/subscribers'
2628
require 'convertkit/resources/subscribers_response'
2729
require 'convertkit/resources/subscription_response'

lib/convertkit/resources/subscriber_bulk_tag_response.rb renamed to lib/convertkit/resources/subscriber_bulk_add_tag_response.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module ConvertKit
22
module Resources
3-
class SubscriberBulkTagResponse
3+
class SubscriberBulkAddTagResponse
44
attr_accessor :subscribers, :failures
55

66
def initialize(response)
@@ -9,7 +9,7 @@ def initialize(response)
99
end
1010

1111
@failures = response['failures'].map do |failure|
12-
ConvertKit::Resources::SubscriberBulkCreateFailureResponse.new(failure)
12+
ConvertKit::Resources::SubscriberBulkTagFailureResponse.new(failure)
1313
end
1414
end
1515
end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module ConvertKit
2+
module Resources
3+
class SubscriberBulkRemoveTagResponse
4+
attr_accessor :failures
5+
6+
def initialize(response)
7+
@failures = response['failures'].map do |failure|
8+
ConvertKit::Resources::SubscriberBulkTagFailureResponse.new(failure)
9+
end
10+
end
11+
end
12+
end
13+
end
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module ConvertKit
2+
module Resources
3+
class SubscriberBulkTagFailureResponse
4+
attr_accessor :subscriber, :errors
5+
6+
def initialize(response)
7+
@subscriber = SubscriberResponse.new(response['subscriber']) if response['subscriber']
8+
@errors = response['errors']
9+
end
10+
end
11+
end
12+
end

lib/convertkit/resources/tags.rb

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,16 +97,28 @@ def subscriptions(tag_id, options = {})
9797
SubscriptionsResponse.new(response)
9898
end
9999

100-
# Bulk tag subscribers
100+
# Bulk add tag to subscribers
101101
# @param [Array<Hash>] taggings
102102
# @option taggings [String] :tag_id
103103
# @option taggings [String] :subscriber_id
104-
def bulk_tag_subscribers(taggings = [])
104+
def bulk_add_to_subscribers(taggings = [])
105105
raise ArgumentError, 'taggings must be an array' unless taggings.is_a?(Array)
106106

107107
response = @client.post("bulk/#{PATH}/subscribers", { taggings: taggings })
108108

109-
ConvertKit::Resources::SubscriberBulkTagResponse.new(response)
109+
ConvertKit::Resources::SubscriberBulkAddTagResponse.new(response)
110+
end
111+
112+
# Bulk remove tag from subscribers
113+
# @param [Array<Hash>] taggings
114+
# @option taggings [String] :tag_id
115+
# @option taggings [String] :subscriber_id
116+
def bulk_remove_from_subscribers(taggings = [])
117+
raise ArgumentError, 'taggings must be an array' unless taggings.is_a?(Array)
118+
119+
response = @client.delete("bulk/#{PATH}/subscribers", { taggings: taggings })
120+
121+
ConvertKit::Resources::SubscriberBulkRemoveTagResponse.new(response)
110122
end
111123
end
112124
end

spec/lib/convertkit/resources/tags_spec.rb

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
end
144144
end
145145

146-
describe '#bulk_tag_subscribers' do
146+
describe '#bulk_add_to_subscribers' do
147147
let(:tags) { ConvertKit::Resources::Tags.new(client) }
148148
let(:taggings) { [{'tag_id' => 1, 'subscriber_id' => 1}] }
149149
let(:response) do
@@ -163,9 +163,81 @@
163163
it 'tags listed subscribers' do
164164
expect(client).to receive(:post).with('bulk/tags/subscribers', {taggings: taggings}).and_return(response)
165165

166-
tags_response = tags.bulk_tag_subscribers(taggings)
166+
tags_response = tags.bulk_add_to_subscribers(taggings)
167167
validate_tagged_subscribers(tags_response, response)
168168
end
169169
end
170+
171+
# Failures are not well documented in the API documentation
172+
context 'with failures' do
173+
let(:response) do
174+
{
175+
'subscribers' => [],
176+
'failures' => [{
177+
'subscriber' => {
178+
'id' => 1,
179+
'first_name' => 'foo',
180+
'email_address' => 'foo@bar.com',
181+
'created_at' => '2023-08-09T04:30:00Z',
182+
},
183+
'errors' => ['Test error message']
184+
}]
185+
}
186+
end
187+
188+
it 'return failures with subscriber and error message' do
189+
expect(client).to receive(:post).with('bulk/tags/subscribers', {taggings: taggings}).and_return(response)
190+
191+
tags_response = tags.bulk_add_to_subscribers(taggings)
192+
expect(tags_response.failures.count).to eq(1)
193+
expect(tags_response.failures.first.subscriber.id).to eq(1)
194+
expect(tags_response.failures.first.errors.first).to eq('Test error message')
195+
end
196+
end
197+
end
198+
199+
describe '#bulk_remove_from_subscribers' do
200+
let(:tags) { ConvertKit::Resources::Tags.new(client) }
201+
let(:taggings) { [{'tag_id' => 1, 'subscriber_id' => 1}] }
202+
let(:response) do
203+
{
204+
'failures' => []
205+
}
206+
end
207+
208+
context 'with taggings provided' do
209+
it 'return no failures' do
210+
expect(client).to receive(:delete).with('bulk/tags/subscribers', {taggings: taggings}).and_return(response)
211+
212+
tags_response = tags.bulk_remove_from_subscribers(taggings)
213+
expect(tags_response.failures).to be_empty
214+
end
215+
end
216+
217+
# Failures are not well documented in the API documentation
218+
context 'with failures' do
219+
let(:response) do
220+
{
221+
'failures' => [{
222+
'subscriber' => {
223+
'id' => 1,
224+
'first_name' => 'foo',
225+
'email_address' => 'foo@bar.com',
226+
'created_at' => '2023-08-09T04:30:00Z',
227+
},
228+
'errors' => ['Test error message']
229+
}]
230+
}
231+
end
232+
233+
it 'return failures with subscriber and error message' do
234+
expect(client).to receive(:delete).with('bulk/tags/subscribers', {taggings: taggings}).and_return(response)
235+
236+
tags_response = tags.bulk_remove_from_subscribers(taggings)
237+
expect(tags_response.failures.count).to eq(1)
238+
expect(tags_response.failures.first.subscriber.id).to eq(1)
239+
expect(tags_response.failures.first.errors.first).to eq('Test error message')
240+
end
241+
end
170242
end
171243
end

0 commit comments

Comments
 (0)