From 8808387e8c7018ed833ab6845eac5b49c6bd7927 Mon Sep 17 00:00:00 2001 From: Guilherme Martini Date: Wed, 8 Jan 2025 14:19:38 -0300 Subject: [PATCH 1/2] rename bulk_tag_response to bulk_add_tag_response --- ...lk_tag_response.rb => subscriber_bulk_add_tag_response.rb} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename lib/convertkit/resources/{subscriber_bulk_tag_response.rb => subscriber_bulk_add_tag_response.rb} (75%) diff --git a/lib/convertkit/resources/subscriber_bulk_tag_response.rb b/lib/convertkit/resources/subscriber_bulk_add_tag_response.rb similarity index 75% rename from lib/convertkit/resources/subscriber_bulk_tag_response.rb rename to lib/convertkit/resources/subscriber_bulk_add_tag_response.rb index bab5e14..5b6cbd4 100644 --- a/lib/convertkit/resources/subscriber_bulk_tag_response.rb +++ b/lib/convertkit/resources/subscriber_bulk_add_tag_response.rb @@ -1,6 +1,6 @@ module ConvertKit module Resources - class SubscriberBulkTagResponse + class SubscriberBulkAddTagResponse attr_accessor :subscribers, :failures def initialize(response) @@ -9,7 +9,7 @@ def initialize(response) end @failures = response['failures'].map do |failure| - ConvertKit::Resources::SubscriberBulkCreateFailureResponse.new(failure) + ConvertKit::Resources::SubscriberBulkTagFailureResponse.new(failure) end end end From 0f6d498ba85b2239d9bcd15d4a247209db044a28 Mon Sep 17 00:00:00 2001 From: Guilherme Martini Date: Wed, 8 Jan 2025 14:20:11 -0300 Subject: [PATCH 2/2] add bulk remove tag from subscriber method --- lib/convertkit.rb | 4 +- .../subscriber_bulk_remove_tag_response.rb | 13 ++++ .../subscriber_bulk_tag_failure_response.rb | 12 +++ lib/convertkit/resources/tags.rb | 18 ++++- spec/lib/convertkit/resources/tags_spec.rb | 76 ++++++++++++++++++- 5 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 lib/convertkit/resources/subscriber_bulk_remove_tag_response.rb create mode 100644 lib/convertkit/resources/subscriber_bulk_tag_failure_response.rb diff --git a/lib/convertkit.rb b/lib/convertkit.rb index 0340212..1449612 100644 --- a/lib/convertkit.rb +++ b/lib/convertkit.rb @@ -19,9 +19,11 @@ require 'convertkit/resources/sequence_response' require 'convertkit/resources/sequences' require 'convertkit/resources/subscriber_response' +require 'convertkit/resources/subscriber_bulk_add_tag_response' require 'convertkit/resources/subscriber_bulk_create_response' require 'convertkit/resources/subscriber_bulk_create_failure_response' -require 'convertkit/resources/subscriber_bulk_tag_response' +require 'convertkit/resources/subscriber_bulk_remove_tag_response' +require 'convertkit/resources/subscriber_bulk_tag_failure_response' require 'convertkit/resources/subscribers' require 'convertkit/resources/subscribers_response' require 'convertkit/resources/subscription_response' diff --git a/lib/convertkit/resources/subscriber_bulk_remove_tag_response.rb b/lib/convertkit/resources/subscriber_bulk_remove_tag_response.rb new file mode 100644 index 0000000..0f8612e --- /dev/null +++ b/lib/convertkit/resources/subscriber_bulk_remove_tag_response.rb @@ -0,0 +1,13 @@ +module ConvertKit + module Resources + class SubscriberBulkRemoveTagResponse + attr_accessor :failures + + def initialize(response) + @failures = response['failures'].map do |failure| + ConvertKit::Resources::SubscriberBulkTagFailureResponse.new(failure) + end + end + end + end +end diff --git a/lib/convertkit/resources/subscriber_bulk_tag_failure_response.rb b/lib/convertkit/resources/subscriber_bulk_tag_failure_response.rb new file mode 100644 index 0000000..da9fb03 --- /dev/null +++ b/lib/convertkit/resources/subscriber_bulk_tag_failure_response.rb @@ -0,0 +1,12 @@ +module ConvertKit + module Resources + class SubscriberBulkTagFailureResponse + attr_accessor :subscriber, :errors + + def initialize(response) + @subscriber = SubscriberResponse.new(response['subscriber']) if response['subscriber'] + @errors = response['errors'] + end + end + end +end diff --git a/lib/convertkit/resources/tags.rb b/lib/convertkit/resources/tags.rb index 984f7be..e06fe4a 100644 --- a/lib/convertkit/resources/tags.rb +++ b/lib/convertkit/resources/tags.rb @@ -97,16 +97,28 @@ def subscriptions(tag_id, options = {}) SubscriptionsResponse.new(response) end - # Bulk tag subscribers + # Bulk add tag to subscribers # @param [Array] taggings # @option taggings [String] :tag_id # @option taggings [String] :subscriber_id - def bulk_tag_subscribers(taggings = []) + def bulk_add_to_subscribers(taggings = []) raise ArgumentError, 'taggings must be an array' unless taggings.is_a?(Array) response = @client.post("bulk/#{PATH}/subscribers", { taggings: taggings }) - ConvertKit::Resources::SubscriberBulkTagResponse.new(response) + ConvertKit::Resources::SubscriberBulkAddTagResponse.new(response) + end + + # Bulk remove tag from subscribers + # @param [Array] taggings + # @option taggings [String] :tag_id + # @option taggings [String] :subscriber_id + def bulk_remove_from_subscribers(taggings = []) + raise ArgumentError, 'taggings must be an array' unless taggings.is_a?(Array) + + response = @client.delete("bulk/#{PATH}/subscribers", { taggings: taggings }) + + ConvertKit::Resources::SubscriberBulkRemoveTagResponse.new(response) end end end diff --git a/spec/lib/convertkit/resources/tags_spec.rb b/spec/lib/convertkit/resources/tags_spec.rb index 757bc9c..9e883a9 100644 --- a/spec/lib/convertkit/resources/tags_spec.rb +++ b/spec/lib/convertkit/resources/tags_spec.rb @@ -143,7 +143,7 @@ end end - describe '#bulk_tag_subscribers' do + describe '#bulk_add_to_subscribers' do let(:tags) { ConvertKit::Resources::Tags.new(client) } let(:taggings) { [{'tag_id' => 1, 'subscriber_id' => 1}] } let(:response) do @@ -163,9 +163,81 @@ it 'tags listed subscribers' do expect(client).to receive(:post).with('bulk/tags/subscribers', {taggings: taggings}).and_return(response) - tags_response = tags.bulk_tag_subscribers(taggings) + tags_response = tags.bulk_add_to_subscribers(taggings) validate_tagged_subscribers(tags_response, response) end end + + # Failures are not well documented in the API documentation + context 'with failures' do + let(:response) do + { + 'subscribers' => [], + 'failures' => [{ + 'subscriber' => { + 'id' => 1, + 'first_name' => 'foo', + 'email_address' => 'foo@bar.com', + 'created_at' => '2023-08-09T04:30:00Z', + }, + 'errors' => ['Test error message'] + }] + } + end + + it 'return failures with subscriber and error message' do + expect(client).to receive(:post).with('bulk/tags/subscribers', {taggings: taggings}).and_return(response) + + tags_response = tags.bulk_add_to_subscribers(taggings) + expect(tags_response.failures.count).to eq(1) + expect(tags_response.failures.first.subscriber.id).to eq(1) + expect(tags_response.failures.first.errors.first).to eq('Test error message') + end + end + end + + describe '#bulk_remove_from_subscribers' do + let(:tags) { ConvertKit::Resources::Tags.new(client) } + let(:taggings) { [{'tag_id' => 1, 'subscriber_id' => 1}] } + let(:response) do + { + 'failures' => [] + } + end + + context 'with taggings provided' do + it 'return no failures' do + expect(client).to receive(:delete).with('bulk/tags/subscribers', {taggings: taggings}).and_return(response) + + tags_response = tags.bulk_remove_from_subscribers(taggings) + expect(tags_response.failures).to be_empty + end + end + + # Failures are not well documented in the API documentation + context 'with failures' do + let(:response) do + { + 'failures' => [{ + 'subscriber' => { + 'id' => 1, + 'first_name' => 'foo', + 'email_address' => 'foo@bar.com', + 'created_at' => '2023-08-09T04:30:00Z', + }, + 'errors' => ['Test error message'] + }] + } + end + + it 'return failures with subscriber and error message' do + expect(client).to receive(:delete).with('bulk/tags/subscribers', {taggings: taggings}).and_return(response) + + tags_response = tags.bulk_remove_from_subscribers(taggings) + expect(tags_response.failures.count).to eq(1) + expect(tags_response.failures.first.subscriber.id).to eq(1) + expect(tags_response.failures.first.errors.first).to eq('Test error message') + end + end end end