effective_mailchimp 0.13.1 → 0.13.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 126c4e6fc6077d165c196a5896ba18609ce996be849fb6890c77ed17f835fedf
4
- data.tar.gz: c1feb68d7b37beadf422a1823060a42c3a972673f8c1a90ea75151212a6106d4
3
+ metadata.gz: 1dbffbf79bcfa6f22f1fd8599abc18a84537380ae16bbf8da55368912d7308ca
4
+ data.tar.gz: 2bafa384fc879e4444e51710569eb5e91337d7d46228b7de4927d3f257a27a48
5
5
  SHA512:
6
- metadata.gz: 204ff5e9669190486a702d7c8ce2c945e429ca4bf79d59d3849b506b7a4d3796b1e936c34ad1fb2eefd8e45a253c564d45ca9813458efeb007bd7a38e4091cb1
7
- data.tar.gz: 78e7bb70af47116dc63055c11fcb84c4dac53e3565e75e6162f19fc1fde8efc83dfcd2ac6057edd399929c5c2f1e13338e269ac645bae9039f254255f33bdbc6
6
+ metadata.gz: '018a4244123fc004b0983d6bcd8aa658c6ca0ba3778b9959c373478af51d473ebc4634b912f5935db96afad46910efd46fe51b35b3956c246e8a07224f6197c8'
7
+ data.tar.gz: 66a53fc0e6142b267a323874712f859145720624f2ea9375867d024f0156ace6acaaf70b168bd712463bf56ec74de0d066870c1f452202577636a56042a7a15d
@@ -3,6 +3,7 @@
3
3
  # https://mailchimp.com/developer/marketing/api/
4
4
 
5
5
  require 'MailchimpMarketing'
6
+ require 'digest'
6
7
 
7
8
  module Effective
8
9
  class MailchimpApi
@@ -75,14 +76,14 @@ module Effective
75
76
  def categories(list_id)
76
77
  Rails.logger.info "[effective_mailchimp] Index Interest Categories" if debug?
77
78
 
78
- response = client.lists.get_list_interest_categories(list_id.try(:mailchimp_id) || list_id)
79
+ response = client.lists.get_list_interest_categories(list_id.try(:mailchimp_id) || list_id, count: 1000)
79
80
  Array(response['categories']) - [nil, '', {}]
80
81
  end
81
82
 
82
83
  def interests(list_id, category_id)
83
84
  Rails.logger.info "[effective_mailchimp] Index Interest Category Interests" if debug?
84
85
 
85
- response = client.lists.list_interest_category_interests(list_id, category_id)
86
+ response = client.lists.list_interest_category_interests(list_id, category_id, count: 1000)
86
87
  Array(response['interests']) - [nil, '', {}]
87
88
  end
88
89
 
@@ -92,7 +93,7 @@ module Effective
92
93
  Rails.logger.info "[effective_mailchimp] Get List Member" if debug?
93
94
 
94
95
  begin
95
- client.lists.get_list_member(id.try(:mailchimp_id) || id, email)
96
+ client.lists.get_list_member(id.try(:mailchimp_id) || id, subscriber_hash(email))
96
97
  rescue MailchimpMarketing::ApiError => e
97
98
  {}
98
99
  end
@@ -127,17 +128,9 @@ module Effective
127
128
  Rails.logger.info "[effective_mailchimp] Add List Member" if debug?
128
129
  return if sandbox_mode?
129
130
 
130
- # See if they exist somehow
131
- existing = list_member(member.mailchimp_list, member.user.email)
132
-
133
- if existing.present?
134
- member.assign_attributes(mailchimp_id: existing['id'])
135
- return list_member_update(member)
136
- end
137
-
138
- # Actually add
139
- payload = list_member_payload(member)
140
- client.lists.add_list_member(member.mailchimp_list.mailchimp_id, payload)
131
+ # Actually add or update. set_list_member applies status_if_new when the contact is new
132
+ payload = list_member_payload(member).merge(status_if_new: list_member_status(member))
133
+ client.lists.set_list_member(member.mailchimp_list.mailchimp_id, subscriber_hash(member.user.email), payload)
141
134
  end
142
135
 
143
136
  def list_member_update(member)
@@ -147,7 +140,8 @@ module Effective
147
140
  return if sandbox_mode?
148
141
 
149
142
  payload = list_member_payload(member)
150
- client.lists.update_list_member(member.mailchimp_list.mailchimp_id, member.email, payload)
143
+ hash = member.mailchimp_id.presence || subscriber_hash(member.email)
144
+ client.lists.update_list_member(member.mailchimp_list.mailchimp_id, hash, payload)
151
145
  end
152
146
 
153
147
  def list_member_payload(member)
@@ -158,11 +152,22 @@ module Effective
158
152
 
159
153
  payload = {
160
154
  email_address: member.user.email,
161
- status: (member.subscribed ? 'subscribed' : 'unsubscribed'),
155
+ status: list_member_status(member),
162
156
  merge_fields: merge_fields.transform_values { |value| value || '' },
163
157
  interests: member.interests_hash.presence
164
158
  }.compact
165
159
  end
166
160
 
161
+ # Mailchimp identifies a list member by the MD5 hash of their lowercase email address
162
+ def subscriber_hash(email)
163
+ raise('expected an email') unless email.to_s.include?('@')
164
+
165
+ Digest::MD5.hexdigest(email.to_s.downcase.strip)
166
+ end
167
+
168
+ def list_member_status(member)
169
+ member.subscribed ? 'subscribed' : 'unsubscribed'
170
+ end
171
+
167
172
  end
168
173
  end
@@ -1,3 +1,3 @@
1
1
  module EffectiveMailchimp
2
- VERSION = '0.13.1'.freeze
2
+ VERSION = '0.13.3'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_mailchimp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.1
4
+ version: 0.13.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-03-13 00:00:00.000000000 Z
11
+ date: 2026-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails