Class: Effective::MailchimpApi
- Inherits:
-
Object
- Object
- Effective::MailchimpApi
- Defined in:
- app/models/effective/mailchimp_api.rb
Instance Attribute Summary collapse
-
#api_key ⇒ Object
Returns the value of attribute api_key.
-
#client ⇒ Object
Returns the value of attribute client.
-
#server ⇒ Object
Returns the value of attribute server.
Instance Method Summary collapse
- #add_merge_field(id, name:, type: :text) ⇒ Object
- #admin_url ⇒ Object
- #audience_url ⇒ Object
- #campaigns_url ⇒ Object
- #categories(list_id) ⇒ Object
- #contacts_url ⇒ Object
- #debug? ⇒ Boolean
- #groups_url ⇒ Object
-
#initialize(api_key:) ⇒ MailchimpApi
constructor
A new instance of MailchimpApi.
- #interests(list_id, category_id) ⇒ Object
- #list(id) ⇒ Object
- #list_member(id, email) ⇒ Object
- #list_member_add(member) ⇒ Object
- #list_member_payload(member) ⇒ Object
- #list_member_status(member) ⇒ Object
- #list_member_update(member) ⇒ Object
- #list_merge_fields(id) ⇒ Object
-
#lists ⇒ Object
Returns an Array of Lists, which are each Hash Like this [{ …}, { … }].
- #ping ⇒ Object
- #public_url ⇒ Object
- #sandbox_mode? ⇒ Boolean
-
#subscriber_hash(email) ⇒ Object
Mailchimp identifies a list member by the MD5 hash of their lowercase email address.
Constructor Details
#initialize(api_key:) ⇒ MailchimpApi
Returns a new instance of MailchimpApi.
14 15 16 17 18 19 20 21 22 23 |
# File 'app/models/effective/mailchimp_api.rb', line 14 def initialize(api_key:) @api_key = api_key @server = api_key.to_s.split('-').last raise('expected an api key') unless @api_key.present? raise('expected an api key') unless @server.present? @client = ::MailchimpMarketing::Client.new() @client.set_config(api_key: @api_key, server: @server) end |
Instance Attribute Details
#api_key ⇒ Object
Returns the value of attribute api_key.
10 11 12 |
# File 'app/models/effective/mailchimp_api.rb', line 10 def api_key @api_key end |
#client ⇒ Object
Returns the value of attribute client.
12 13 14 |
# File 'app/models/effective/mailchimp_api.rb', line 12 def client @client end |
#server ⇒ Object
Returns the value of attribute server.
11 12 13 |
# File 'app/models/effective/mailchimp_api.rb', line 11 def server @server end |
Instance Method Details
#add_merge_field(id, name:, type: :text) ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'app/models/effective/mailchimp_api.rb', line 109 def add_merge_field(id, name:, type: :text) raise("invalid mailchimp merge key: #{name}. Must be 10 or fewer characters") if name.to_s.length > 10 Rails.logger.info "[effective_mailchimp] Add List Merge Field #{name}" if debug? return if sandbox_mode? payload = { name: name.to_s.titleize, tag: name.to_s, type: type } begin client.lists.add_list_merge_field(id.try(:mailchimp_id) || id, payload) rescue MailchimpMarketing::ApiError => e EffectiveLogger.error(e., details: name.to_s) if defined?(EffectiveLogger) false end end |
#admin_url ⇒ Object
33 34 35 |
# File 'app/models/effective/mailchimp_api.rb', line 33 def admin_url "https://#{server}.admin.mailchimp.com" end |
#audience_url ⇒ Object
37 38 39 |
# File 'app/models/effective/mailchimp_api.rb', line 37 def audience_url "https://#{server}.admin.mailchimp.com/audience/" end |
#campaigns_url ⇒ Object
49 50 51 |
# File 'app/models/effective/mailchimp_api.rb', line 49 def campaigns_url "https://#{server}.admin.mailchimp.com/campaigns/" end |
#categories(list_id) ⇒ Object
76 77 78 79 80 81 |
# File 'app/models/effective/mailchimp_api.rb', line 76 def categories(list_id) Rails.logger.info "[effective_mailchimp] Index Interest Categories" if debug? response = client.lists.get_list_interest_categories(list_id.try(:mailchimp_id) || list_id, count: 1000) Array(response['categories']) - [nil, '', {}] end |
#contacts_url ⇒ Object
45 46 47 |
# File 'app/models/effective/mailchimp_api.rb', line 45 def contacts_url "https://#{server}.admin.mailchimp.com/audience/contacts" end |
#debug? ⇒ Boolean
25 26 27 |
# File 'app/models/effective/mailchimp_api.rb', line 25 def debug? Rails.env.development? end |
#groups_url ⇒ Object
41 42 43 |
# File 'app/models/effective/mailchimp_api.rb', line 41 def groups_url "https://#{server}.admin.mailchimp.com/audience/groups/" end |
#interests(list_id, category_id) ⇒ Object
83 84 85 86 87 88 |
# File 'app/models/effective/mailchimp_api.rb', line 83 def interests(list_id, category_id) Rails.logger.info "[effective_mailchimp] Index Interest Category Interests" if debug? response = client.lists.list_interest_category_interests(list_id, category_id, count: 1000) Array(response['interests']) - [nil, '', {}] end |
#list(id) ⇒ Object
70 71 72 73 74 |
# File 'app/models/effective/mailchimp_api.rb', line 70 def list(id) Rails.logger.info "[effective_mailchimp] Get List" if debug? client.lists.get_list(id.try(:mailchimp_id) || id) end |
#list_member(id, email) ⇒ Object
90 91 92 93 94 95 96 97 98 99 100 |
# File 'app/models/effective/mailchimp_api.rb', line 90 def list_member(id, email) raise('expected an email') unless email.to_s.include?('@') Rails.logger.info "[effective_mailchimp] Get List Member" if debug? begin client.lists.get_list_member(id.try(:mailchimp_id) || id, subscriber_hash(email)) rescue MailchimpMarketing::ApiError => e {} end end |
#list_member_add(member) ⇒ Object
125 126 127 128 129 130 131 132 133 134 |
# File 'app/models/effective/mailchimp_api.rb', line 125 def list_member_add(member) raise('expected an Effective::MailchimpListMember') unless member.kind_of?(Effective::MailchimpListMember) Rails.logger.info "[effective_mailchimp] Add List Member" if debug? return if sandbox_mode? # Actually add or update. set_list_member applies status_if_new when the contact is new payload = list_member_payload(member).merge(status_if_new: list_member_status(member)) client.lists.set_list_member(member.mailchimp_list.mailchimp_id, subscriber_hash(member.user.email), payload) end |
#list_member_payload(member) ⇒ Object
147 148 149 150 151 152 153 154 155 156 157 158 159 |
# File 'app/models/effective/mailchimp_api.rb', line 147 def list_member_payload(member) raise('expected an Effective::MailchimpListMember') unless member.kind_of?(Effective::MailchimpListMember) merge_fields = member.user.mailchimp_merge_fields raise('expected user mailchimp_merge_fields to be a Hash') unless merge_fields.kind_of?(Hash) payload = { email_address: member.user.email, status: list_member_status(member), merge_fields: merge_fields.transform_values { |value| value || '' }, interests: member.interests_hash.presence }.compact end |
#list_member_status(member) ⇒ Object
168 169 170 |
# File 'app/models/effective/mailchimp_api.rb', line 168 def list_member_status(member) member.subscribed ? 'subscribed' : 'unsubscribed' end |
#list_member_update(member) ⇒ Object
136 137 138 139 140 141 142 143 144 145 |
# File 'app/models/effective/mailchimp_api.rb', line 136 def list_member_update(member) raise('expected an Effective::MailchimpListMember') unless member.kind_of?(Effective::MailchimpListMember) Rails.logger.info "[effective_mailchimp] Update List Member" if debug? return if sandbox_mode? payload = list_member_payload(member) hash = member.mailchimp_id.presence || subscriber_hash(member.email) client.lists.update_list_member(member.mailchimp_list.mailchimp_id, hash, payload) end |
#list_merge_fields(id) ⇒ Object
102 103 104 105 106 107 |
# File 'app/models/effective/mailchimp_api.rb', line 102 def list_merge_fields(id) Rails.logger.info "[effective_mailchimp] Get List Merge Fields" if debug? response = client.lists.get_list_merge_fields(id.try(:mailchimp_id) || id, count: 100) Array(response['merge_fields']) - [nil, '', ' ', {}] end |
#lists ⇒ Object
Returns an Array of Lists, which are each Hash Like this [{ …}, { … }]
63 64 65 66 67 68 |
# File 'app/models/effective/mailchimp_api.rb', line 63 def lists Rails.logger.info "[effective_mailchimp] Index Lists" if debug? response = client.lists.get_all_lists(count: 250) Array(response['lists']) - [nil, '', {}] end |
#ping ⇒ Object
57 58 59 |
# File 'app/models/effective/mailchimp_api.rb', line 57 def ping client.ping.get() end |
#public_url ⇒ Object
53 54 55 |
# File 'app/models/effective/mailchimp_api.rb', line 53 def public_url "https://mailchimp.com" end |
#sandbox_mode? ⇒ Boolean
29 30 31 |
# File 'app/models/effective/mailchimp_api.rb', line 29 def sandbox_mode? EffectiveMailchimp.sandbox_mode? end |
#subscriber_hash(email) ⇒ Object
Mailchimp identifies a list member by the MD5 hash of their lowercase email address
162 163 164 165 166 |
# File 'app/models/effective/mailchimp_api.rb', line 162 def subscriber_hash(email) raise('expected an email') unless email.to_s.include?('@') Digest::MD5.hexdigest(email.to_s.downcase.strip) end |