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.



13
14
15
16
17
18
19
20
21
22
# File 'app/models/effective/mailchimp_api.rb', line 13

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.



9
10
11
# File 'app/models/effective/mailchimp_api.rb', line 9

def api_key
  @api_key
end

#clientObject

Returns the value of attribute client.



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

def client
  @client
end

#serverObject

Returns the value of attribute server.



10
11
12
# File 'app/models/effective/mailchimp_api.rb', line 10

def server
  @server
end

Instance Method Details

#add_merge_field(id, name:, type: :text) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
# File 'app/models/effective/mailchimp_api.rb', line 70

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

  payload = { name: name.to_s.titleize, tag: name.to_s, type: type }

  begin
    client.lists.add_list_merge_field(id, payload)
  rescue MailchimpMarketing::ApiError => e
    false
  end
end

#admin_urlObject



28
29
30
# File 'app/models/effective/mailchimp_api.rb', line 28

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

#debug?Boolean

Returns:

  • (Boolean)


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

def debug?
  Rails.env.development?
end

#list(id) ⇒ Object



49
50
51
52
53
# File 'app/models/effective/mailchimp_api.rb', line 49

def list(id)
  Rails.logger.info "[effective_mailchimp] Show List..." if debug?

  client.lists.get_list(id.try(:mailchimp_id) || id)
end

#list_member(id, email) ⇒ Object



55
56
57
58
59
60
61
62
63
# File 'app/models/effective/mailchimp_api.rb', line 55

def list_member(id, email)
  raise('expected an email') unless email.to_s.include?('@')

  begin
    client.lists.get_list_member(id.try(:mailchimp_id) || id, email)
  rescue MailchimpMarketing::ApiError => e
    {}
  end
end

#list_member_add(member) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'app/models/effective/mailchimp_api.rb', line 82

def list_member_add(member)
  raise('expected an Effective::MailchimpListMember') unless member.kind_of?(Effective::MailchimpListMember)

  existing = list_member(member.mailchimp_list, member.user.email)
  return existing if existing.present?

  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: (member.subscribed ? 'subscribed' : 'unsubscribed'),
    merge_fields: merge_fields.delete_if { |k, v| v.blank? }
  }

  begin
    client.lists.add_list_member(member.mailchimp_list.mailchimp_id, payload)
  rescue MailchimpMarketing::ApiError => e
    return false if e.status == 400 && e.to_s.downcase.include?("member in compliance state")
    raise(e)
  end

end

#list_member_update(member) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'app/models/effective/mailchimp_api.rb', line 106

def list_member_update(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: (member.subscribed ? 'subscribed' : 'unsubscribed'),
    merge_fields: merge_fields.delete_if { |k, v| v.blank? }
  }

  client.lists.update_list_member(member.mailchimp_list.mailchimp_id, member.email, payload)
end

#list_merge_fields(id) ⇒ Object



65
66
67
68
# File 'app/models/effective/mailchimp_api.rb', line 65

def list_merge_fields(id)
  response = client.lists.get_list_merge_fields(id, count: 100)
  Array(response['merge_fields']) - [nil, '', {}]
end

#listsObject

Returns an Array of Lists, which are each Hash Like this [{ …}, { … }]



42
43
44
45
46
47
# File 'app/models/effective/mailchimp_api.rb', line 42

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



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

def ping
  client.ping.get()
end

#public_urlObject



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

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