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
- #debug? ⇒ Boolean
-
#initialize(api_key:) ⇒ MailchimpApi
constructor
A new instance of MailchimpApi.
- #list(id) ⇒ Object
- #list_member(id, email) ⇒ Object
- #list_member_add(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
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_key ⇒ Object
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 |
#client ⇒ Object
Returns the value of attribute client.
11 12 13 |
# File 'app/models/effective/mailchimp_api.rb', line 11 def client @client end |
#server ⇒ Object
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_url ⇒ Object
28 29 30 |
# File 'app/models/effective/mailchimp_api.rb', line 28 def admin_url "https://#{server}.admin.mailchimp.com" end |
#debug? ⇒ 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 |
#lists ⇒ Object
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 |
#ping ⇒ Object
36 37 38 |
# File 'app/models/effective/mailchimp_api.rb', line 36 def ping client.ping.get() end |
#public_url ⇒ Object
32 33 34 |
# File 'app/models/effective/mailchimp_api.rb', line 32 def public_url "https://mailchimp.com" end |