From ff26763d75151f57b9724a50d8be55209301c138 Mon Sep 17 00:00:00 2001 From: Adin Horovitz Date: Tue, 17 Dec 2024 17:37:42 -0800 Subject: [PATCH 1/9] add DeveloperClient, which uses an API Key instead of OAuth access_token --- lib/convertkit/client.rb | 8 ++++++++ lib/convertkit/connection.rb | 6 +++++- spec/lib/convertkit/developer_client_spec.rb | 13 +++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 spec/lib/convertkit/developer_client_spec.rb diff --git a/lib/convertkit/client.rb b/lib/convertkit/client.rb index 550bcaa..222a0e6 100644 --- a/lib/convertkit/client.rb +++ b/lib/convertkit/client.rb @@ -69,4 +69,12 @@ def handle_response(response, raw_response= false) end end end + + # This client behaves like the standard Client, but uses an API Key rather than OAuth access_token. + # Certain API resources can only be accessed with an OAuth access_token + class DeveloperClient < Client + def initialize(api_key) + @connection = ConvertKit::Connection.new(API_URL, api_key: api_key) + end + end end diff --git a/lib/convertkit/connection.rb b/lib/convertkit/connection.rb index 367e9b0..0174dcc 100644 --- a/lib/convertkit/connection.rb +++ b/lib/convertkit/connection.rb @@ -11,7 +11,11 @@ def initialize(url, options = {}) @url = url @connection = Faraday.new(url: @url, headers: {'content-type' => MIME_TYPE }) do |builder| - builder.request :authorization, 'Bearer', options[:auth_token] if options[:auth_token] + if options[:auth_token] + builder.request :authorization, 'Bearer', options[:auth_token] + elsif options[:api_key] + builder.request 'X-Kit-Api-Key'.to_sym, 'Bearer', options[:api_key] + end end end diff --git a/spec/lib/convertkit/developer_client_spec.rb b/spec/lib/convertkit/developer_client_spec.rb new file mode 100644 index 0000000..3e71098 --- /dev/null +++ b/spec/lib/convertkit/developer_client_spec.rb @@ -0,0 +1,13 @@ +describe ConvertKit::DeveloperClient do + let(:connection) { double('connection') } + + describe '#initialize' do + it 'sets the api_key' do + expect(ConvertKit::Connection).to receive(:new) + .with(ConvertKit::Client::API_URL, api_key: 'test_token') + .and_return(connection) + client = ConvertKit::DeveloperClient.new('test_token') + expect(client.instance_variable_get(:@connection)).to eq(connection) + end + end +end \ No newline at end of file From 27e0eac2b9f4faf16812d0096dee7c0d2df32e3e Mon Sep 17 00:00:00 2001 From: Adin Horovitz Date: Tue, 17 Dec 2024 22:02:23 -0800 Subject: [PATCH 2/9] pass api_key in headers instead of to Faraday constructor --- lib/convertkit/connection.rb | 10 +++++++--- spec/lib/convertkit/connection_spec.rb | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/convertkit/connection.rb b/lib/convertkit/connection.rb index 0174dcc..78cfba2 100644 --- a/lib/convertkit/connection.rb +++ b/lib/convertkit/connection.rb @@ -10,11 +10,9 @@ class Connection def initialize(url, options = {}) @url = url - @connection = Faraday.new(url: @url, headers: {'content-type' => MIME_TYPE }) do |builder| + @connection = Faraday.new(url: @url, headers: default_headers(options)) do |builder| if options[:auth_token] builder.request :authorization, 'Bearer', options[:auth_token] - elsif options[:api_key] - builder.request 'X-Kit-Api-Key'.to_sym, 'Bearer', options[:api_key] end end end @@ -36,6 +34,12 @@ def initialize(url, options = {}) private + def default_headers(options) + headers = { 'Content-Type' => MIME_TYPE } + headers['X-Kit-Api-Key'] = options[:api_key] if options[:api_key] + headers + end + def process_request(method, params) return params if method == :get return params if params.empty? diff --git a/spec/lib/convertkit/connection_spec.rb b/spec/lib/convertkit/connection_spec.rb index 866b272..2744425 100644 --- a/spec/lib/convertkit/connection_spec.rb +++ b/spec/lib/convertkit/connection_spec.rb @@ -3,7 +3,7 @@ describe '#initialize' do it 'creates a new Faraday connection' do - expect(Faraday).to receive(:new).with(url: url, headers: {'content-type' => 'application/json' }) + expect(Faraday).to receive(:new).with(url: url, headers: {'Content-Type' => 'application/json' }) ConvertKit::Connection.new(url) end end From 1a85d52806e9150d1d8409e3010031f706527832 Mon Sep 17 00:00:00 2001 From: Adin Horovitz Date: Fri, 20 Dec 2024 17:12:47 -0800 Subject: [PATCH 3/9] add update method to Tags Resource --- lib/convertkit/resources/tags.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/convertkit/resources/tags.rb b/lib/convertkit/resources/tags.rb index b9625f4..6fb28c3 100644 --- a/lib/convertkit/resources/tags.rb +++ b/lib/convertkit/resources/tags.rb @@ -26,6 +26,17 @@ def create(name) TagResponse.new(response) end + # Update the name of a Tag + # See https://developers.kit.com/v4#update-tag-name for details + # @param [Integer] tag_id + # @param [Hash] options + # @option options [String] :name New name for Tag + def update(tag_id, options = {}) + request_options = options.slice(:name) + response = @client.put("#{PATH}/#{tag_id}", request_options) + TagResponse.new(response['tag']) + end + # Tags a subscriber # See https://developers.convertkit.com/v4.html#tag-a-subscriber for details # @param [Integer] tag_id From ee48eff9471c4d3214ca99f71ef863b3a4e6e665 Mon Sep 17 00:00:00 2001 From: Adin Horovitz Date: Fri, 20 Dec 2024 18:28:02 -0800 Subject: [PATCH 4/9] fix tag_create bug --- lib/convertkit/resources/tags.rb | 2 +- spec/lib/convertkit/resources/tags_spec.rb | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/convertkit/resources/tags.rb b/lib/convertkit/resources/tags.rb index 6fb28c3..d13aba1 100644 --- a/lib/convertkit/resources/tags.rb +++ b/lib/convertkit/resources/tags.rb @@ -23,7 +23,7 @@ def list def create(name) response = @client.post(PATH, { name: name }) - TagResponse.new(response) + TagResponse.new(response['tag']) end # Update the name of a Tag diff --git a/spec/lib/convertkit/resources/tags_spec.rb b/spec/lib/convertkit/resources/tags_spec.rb index b8edb8d..deb52b5 100644 --- a/spec/lib/convertkit/resources/tags_spec.rb +++ b/spec/lib/convertkit/resources/tags_spec.rb @@ -31,10 +31,10 @@ context 'when name is a string' do it 'creates a tag' do - response = { 'id' => 1, 'name' => 'tag_name', account_id: 1, state: 'available', 'created_at' => '2023-08-09T04:30:00Z', updated_at: '2023-08-09T04:30:00Z'} + response = {'tag' => { 'id' => 1, 'name' => 'tag_name', account_id: 1, state: 'available', 'created_at' => '2023-08-09T04:30:00Z', updated_at: '2023-08-09T04:30:00Z'}} expect(client).to receive(:post).with('tags', {name: 'tag_name'}).and_return(response) tags_response = tags.create('tag_name') - validate_tag(tags_response, response) + validate_tag(tags_response, response['tag']) end end end From 76426c57a4e8adc6c318f8219c0a46ed3d3875ee Mon Sep 17 00:00:00 2001 From: Adin Horovitz Date: Mon, 30 Dec 2024 17:22:27 -0800 Subject: [PATCH 5/9] bulk_tag_subscribers + tests --- lib/convertkit.rb | 1 + .../resources/subscriber_bulk_tag_response.rb | 17 ++++++++++++ .../resources/subscriber_response.rb | 12 +++++++++ lib/convertkit/resources/tags.rb | 12 +++++++++ spec/lib/convertkit/resources/tags_spec.rb | 26 +++++++++++++++++++ spec/validators/subscriber_validators.rb | 12 +++++++++ 6 files changed, 80 insertions(+) create mode 100644 lib/convertkit/resources/subscriber_bulk_tag_response.rb diff --git a/lib/convertkit.rb b/lib/convertkit.rb index c50757d..0340212 100644 --- a/lib/convertkit.rb +++ b/lib/convertkit.rb @@ -21,6 +21,7 @@ require 'convertkit/resources/subscriber_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/subscribers' require 'convertkit/resources/subscribers_response' require 'convertkit/resources/subscription_response' diff --git a/lib/convertkit/resources/subscriber_bulk_tag_response.rb b/lib/convertkit/resources/subscriber_bulk_tag_response.rb new file mode 100644 index 0000000..bab5e14 --- /dev/null +++ b/lib/convertkit/resources/subscriber_bulk_tag_response.rb @@ -0,0 +1,17 @@ +module ConvertKit + module Resources + class SubscriberBulkTagResponse + attr_accessor :subscribers, :failures + + def initialize(response) + @subscribers = response['subscribers'].map do |subscriber| + ConvertKit::Resources::TaggedSubscriberResponse.new(subscriber) + end + + @failures = response['failures'].map do |failure| + ConvertKit::Resources::SubscriberBulkCreateFailureResponse.new(failure) + end + end + end + end +end diff --git a/lib/convertkit/resources/subscriber_response.rb b/lib/convertkit/resources/subscriber_response.rb index 63da643..4b1103b 100644 --- a/lib/convertkit/resources/subscriber_response.rb +++ b/lib/convertkit/resources/subscriber_response.rb @@ -12,5 +12,17 @@ def initialize(response) @created_at = ConvertKit::Utils.to_datetime(response['created_at']) end end + + class TaggedSubscriberResponse + attr_accessor :id, :first_name, :email, :created_at, :tagged_at + + def initialize(response) + @id = response['id'] + @first_name = response['first_name'] + @email = response['email_address'] + @created_at = ConvertKit::Utils.to_datetime(response['created_at']) + @tagged_at = ConvertKit::Utils.to_datetime(response['tagged_at']) + end + end end end diff --git a/lib/convertkit/resources/tags.rb b/lib/convertkit/resources/tags.rb index d13aba1..984f7be 100644 --- a/lib/convertkit/resources/tags.rb +++ b/lib/convertkit/resources/tags.rb @@ -96,6 +96,18 @@ def subscriptions(tag_id, options = {}) SubscriptionsResponse.new(response) end + + # Bulk tag subscribers + # @param [Array] taggings + # @option taggings [String] :tag_id + # @option taggings [String] :subscriber_id + def bulk_tag_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) + end end end end diff --git a/spec/lib/convertkit/resources/tags_spec.rb b/spec/lib/convertkit/resources/tags_spec.rb index deb52b5..757bc9c 100644 --- a/spec/lib/convertkit/resources/tags_spec.rb +++ b/spec/lib/convertkit/resources/tags_spec.rb @@ -142,4 +142,30 @@ validate_subscriptions(tag_subscriptions_response, response) end end + + describe '#bulk_tag_subscribers' do + let(:tags) { ConvertKit::Resources::Tags.new(client) } + let(:taggings) { [{'tag_id' => 1, 'subscriber_id' => 1}] } + let(:response) do + { + 'subscribers' => [{ + 'id' => 1, + 'first_name' => 'foo', + 'email_address' => 'foo@bar.com', + 'created_at' => '2023-08-09T04:30:00Z', + 'tagged_at' => '2023-08-09T04:30:00Z' + }], + 'failures' => [] + } + end + + context 'with taggings provided' do + 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) + validate_tagged_subscribers(tags_response, response) + end + end + end end diff --git a/spec/validators/subscriber_validators.rb b/spec/validators/subscriber_validators.rb index dbc2548..9b646d5 100644 --- a/spec/validators/subscriber_validators.rb +++ b/spec/validators/subscriber_validators.rb @@ -19,6 +19,18 @@ def validate_subscribers(subscribers, values) end end + def validate_tagged_subscribers(subscribers, values) + subscribers.subscribers.each_with_index do |subscriber, index| + values = values['subscribers'][index] + + expect(subscriber.id).to eq(values['id']) + expect(subscriber.first_name).to eq(values['first_name']) + expect(subscriber.email).to eq(values['email_address']) + expect(subscriber.created_at).to eq(DateTime.parse(values['created_at'])) unless values.fetch('created_at', '').strip.empty? + expect(subscriber.tagged_at).to eq(DateTime.parse(values['tagged_at'])) unless values.fetch('tagged_at', '').strip.empty? + end + end + def validate_bulk_create_failure(bulk_create_failure_response, values) expect(bulk_create_failure_response.errors).to match_array(values['errors']) if values['errors'] validate_subscriber(bulk_create_failure_response.subscriber, values['subscriber']) if values['subscriber'] From 8808387e8c7018ed833ab6845eac5b49c6bd7927 Mon Sep 17 00:00:00 2001 From: Guilherme Martini Date: Wed, 8 Jan 2025 14:19:38 -0300 Subject: [PATCH 6/9] 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 7/9] 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 From f2f984c9ed24a76dae8f8bce319c08f266c96039 Mon Sep 17 00:00:00 2001 From: Guilherme Martini Date: Fri, 10 Jan 2025 19:00:45 -0300 Subject: [PATCH 8/9] add support for failures --- lib/convertkit.rb | 1 + .../subscriber_bulk_tag_failure_response.rb | 4 ++-- lib/convertkit/resources/subscriber_tag_response.rb | 12 ++++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 lib/convertkit/resources/subscriber_tag_response.rb diff --git a/lib/convertkit.rb b/lib/convertkit.rb index 1449612..dca157b 100644 --- a/lib/convertkit.rb +++ b/lib/convertkit.rb @@ -24,6 +24,7 @@ require 'convertkit/resources/subscriber_bulk_create_failure_response' require 'convertkit/resources/subscriber_bulk_remove_tag_response' require 'convertkit/resources/subscriber_bulk_tag_failure_response' +require 'convertkit/resources/subscriber_tag_response' require 'convertkit/resources/subscribers' require 'convertkit/resources/subscribers_response' require 'convertkit/resources/subscription_response' diff --git a/lib/convertkit/resources/subscriber_bulk_tag_failure_response.rb b/lib/convertkit/resources/subscriber_bulk_tag_failure_response.rb index da9fb03..4aa5452 100644 --- a/lib/convertkit/resources/subscriber_bulk_tag_failure_response.rb +++ b/lib/convertkit/resources/subscriber_bulk_tag_failure_response.rb @@ -1,10 +1,10 @@ module ConvertKit module Resources class SubscriberBulkTagFailureResponse - attr_accessor :subscriber, :errors + attr_accessor :tagging, :errors def initialize(response) - @subscriber = SubscriberResponse.new(response['subscriber']) if response['subscriber'] + @tagging = SubscriberTagResponse.new(response['tagging']) if response['tagging'] @errors = response['errors'] end end diff --git a/lib/convertkit/resources/subscriber_tag_response.rb b/lib/convertkit/resources/subscriber_tag_response.rb new file mode 100644 index 0000000..c198f79 --- /dev/null +++ b/lib/convertkit/resources/subscriber_tag_response.rb @@ -0,0 +1,12 @@ +module ConvertKit + module Resources + class SubscriberTagResponse + attr_accessor :tag_id, :subscriber_id + + def initialize(response) + @tag_id = response['tag_id'] + @subscriber_id = response['subscriber_id'] + end + end + end +end From 770c040a5dc21a5ac2b4021cfb9352ffa8610cb6 Mon Sep 17 00:00:00 2001 From: Guilherme Martini Date: Fri, 10 Jan 2025 19:13:09 -0300 Subject: [PATCH 9/9] fix tests --- spec/lib/convertkit/resources/tags_spec.rb | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/spec/lib/convertkit/resources/tags_spec.rb b/spec/lib/convertkit/resources/tags_spec.rb index 9e883a9..5625291 100644 --- a/spec/lib/convertkit/resources/tags_spec.rb +++ b/spec/lib/convertkit/resources/tags_spec.rb @@ -174,11 +174,9 @@ { 'subscribers' => [], 'failures' => [{ - 'subscriber' => { - 'id' => 1, - 'first_name' => 'foo', - 'email_address' => 'foo@bar.com', - 'created_at' => '2023-08-09T04:30:00Z', + 'tagging' => { + 'subscriber_id' => 1, + 'tag_id' => 2, }, 'errors' => ['Test error message'] }] @@ -190,7 +188,8 @@ 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.tagging.subscriber_id).to eq(1) + expect(tags_response.failures.first.tagging.tag_id).to eq(2) expect(tags_response.failures.first.errors.first).to eq('Test error message') end end @@ -219,11 +218,9 @@ let(:response) do { 'failures' => [{ - 'subscriber' => { - 'id' => 1, - 'first_name' => 'foo', - 'email_address' => 'foo@bar.com', - 'created_at' => '2023-08-09T04:30:00Z', + 'tagging' => { + 'subscriber_id' => 1, + 'tag_id' => 2, }, 'errors' => ['Test error message'] }] @@ -235,7 +232,8 @@ 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.tagging.subscriber_id).to eq(1) + expect(tags_response.failures.first.tagging.tag_id).to eq(2) expect(tags_response.failures.first.errors.first).to eq('Test error message') end end