Class: Effective::MailchimpApi

Inherits:
Object
  • Object
show all
Defined in:
app/models/effective/mailchimp_api.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

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_keyObject

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

#clientObject

Returns the value of attribute client.



12
13
14
# File 'app/models/effective/mailchimp_api.rb', line 12

def client
  @client
end

#serverObject

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.message, details: name.to_s) if defined?(EffectiveLogger)
    false
  end
end

#admin_urlObject



33
34
35
# File 'app/models/effective/mailchimp_api.rb', line 33

def admin_url
  "https://#{server}.admin.mailchimp.com"
end

#audience_urlObject



37
38
39
# File 'app/models/effective/mailchimp_api.rb', line 37

def audience_url
  "https://#{server}.admin.mailchimp.com/audience/"
end

#campaigns_urlObject



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_urlObject



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

Returns:

  • (Boolean)


25
26
27
# File 'app/models/effective/mailchimp_api.rb', line 25

def debug?
  Rails.env.development?
end

#groups_urlObject



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

#listsObject

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

#pingObject



57
58
59
# File 'app/models/effective/mailchimp_api.rb', line 57

def ping
  client.ping.get()
end

#public_urlObject



53
54
55
# File 'app/models/effective/mailchimp_api.rb', line 53

def public_url
  "https://mailchimp.com"
end

#sandbox_mode?Boolean

Returns:

  • (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