workarea-mail_chimp 3.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +15 -0
- data/.gitignore +55 -0
- data/.markdownlint.json +10 -0
- data/.rails-rubocop.yml +119 -0
- data/.rubocop.yml +8 -0
- data/.scss-lint.yml +188 -0
- data/CHANGELOG.md +244 -0
- data/Gemfile +9 -0
- data/README.md +115 -0
- data/Rakefile +53 -0
- data/app/assets/javascripts/workarea/storefront/mail_chimp/mail_chimp_tracking.js +15 -0
- data/app/controllers/workarea/storefront/application_controller.decorator +11 -0
- data/app/controllers/workarea/storefront/cart_items_controller.decorator +18 -0
- data/app/controllers/workarea/storefront/checkout/addresses_controller.decorator +13 -0
- data/app/controllers/workarea/storefront/checkout/shipping_controller.decorator +13 -0
- data/app/controllers/workarea/storefront/users/accounts_controller.decorator +37 -0
- data/app/models/workarea/catalog/product.decorator +7 -0
- data/app/models/workarea/mail_chimp/group.rb +39 -0
- data/app/models/workarea/mail_chimp/store.rb +26 -0
- data/app/models/workarea/order.decorator +9 -0
- data/app/models/workarea/user.decorator +31 -0
- data/app/services/workarea/mail_chimp/address.rb +28 -0
- data/app/services/workarea/mail_chimp/cart.rb +78 -0
- data/app/services/workarea/mail_chimp/order.rb +97 -0
- data/app/services/workarea/mail_chimp/product.rb +43 -0
- data/app/services/workarea/mail_chimp/variant.rb +43 -0
- data/app/view_models/workarea/storefront/user_view_model.decorator +16 -0
- data/app/views/workarea/storefront/mail_chimp/_ecommerce_javascript.html.haml +2 -0
- data/app/views/workarea/storefront/users/accounts/_edit.html.haml +12 -0
- data/app/views/workarea/storefront/users/accounts/_email_interests.html.haml +13 -0
- data/app/workers/workarea/mail_chimp/ecommerce/save_cart.rb +40 -0
- data/app/workers/workarea/mail_chimp/ecommerce/save_order.rb +31 -0
- data/app/workers/workarea/mail_chimp/ecommerce/save_product.rb +31 -0
- data/app/workers/workarea/mail_chimp/list_subscriber.rb +30 -0
- data/app/workers/workarea/mail_chimp/list_unsubscriber.rb +22 -0
- data/app/workers/workarea/mail_chimp/subscription_edit.rb +28 -0
- data/bin/rails +19 -0
- data/config/initializers/appends.rb +21 -0
- data/config/initializers/workarea.rb +14 -0
- data/config/locales/en.yml +15 -0
- data/lib/gibbon/request_decorator.rb +10 -0
- data/lib/integrations/workarea/mail_chimp/bogus_api_request.rb +30 -0
- data/lib/integrations/workarea/mail_chimp/bogus_gateway.rb +35 -0
- data/lib/integrations/workarea/mail_chimp/bogus_request.rb +78 -0
- data/lib/integrations/workarea/mail_chimp/gateway.rb +86 -0
- data/lib/integrations/workarea/mail_chimp/gateway/list.rb +47 -0
- data/lib/integrations/workarea/mail_chimp/gateway/members.rb +61 -0
- data/lib/integrations/workarea/mail_chimp/gateway/subscribe_argument_builder.rb +101 -0
- data/lib/tasks/mail_chimp.rake +71 -0
- data/lib/workarea/mail_chimp.rb +72 -0
- data/lib/workarea/mail_chimp/engine.rb +14 -0
- data/lib/workarea/mail_chimp/errors.rb +2 -0
- data/lib/workarea/mail_chimp/tasks/ecommerce.rb +43 -0
- data/lib/workarea/mail_chimp/version.rb +5 -0
- data/script/admin_ci +9 -0
- data/script/ci +11 -0
- data/script/core_ci +9 -0
- data/script/plugins_ci +9 -0
- data/script/storefront_ci +9 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/config/manifest.js +4 -0
- data/test/dummy/app/assets/images/.keep +0 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/concerns/.keep +0 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/jobs/application_job.rb +2 -0
- data/test/dummy/app/mailers/application_mailer.rb +4 -0
- data/test/dummy/app/models/concerns/.keep +0 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
- data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +34 -0
- data/test/dummy/bin/update +29 -0
- data/test/dummy/config.ru +5 -0
- data/test/dummy/config/application.rb +23 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/cable.yml +9 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +56 -0
- data/test/dummy/config/environments/production.rb +86 -0
- data/test/dummy/config/environments/test.rb +43 -0
- data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/new_framework_defaults.rb +21 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/workarea.rb +5 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/puma.rb +47 -0
- data/test/dummy/config/routes.rb +5 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config/spring.rb +6 -0
- data/test/dummy/db/seeds.rb +2 -0
- data/test/dummy/lib/assets/.keep +0 -0
- data/test/factories/mail_chimp.rb +50 -0
- data/test/integration/workarea/mailchimp/subscription_test.rb +52 -0
- data/test/integration/workarea/mailchimp/tracking_params_test.rb +50 -0
- data/test/integration/workarea/mailchimp/unsubscribe_test.rb +14 -0
- data/test/integration/workarea/storefront/mail_chimp_order_test.rb +106 -0
- data/test/integration/workarea/storefront/mail_chimp_product_test.rb +51 -0
- data/test/integration/workarea/storefront/mail_chimp_site_javascript_test.rb +25 -0
- data/test/lib/workarea/mailchimp/gateway/list_test.rb +48 -0
- data/test/lib/workarea/mailchimp/gateway_test.rb +196 -0
- data/test/lib/workarea/mailchimp/tasks/ecommerce_test.rb +40 -0
- data/test/services/workarea/mail_chimp/cart_test.rb +44 -0
- data/test/services/workarea/mail_chimp/order_test.rb +50 -0
- data/test/services/workarea/mail_chimp/product_test.rb +29 -0
- data/test/support/workarea/mail_chimp_api_config.rb +33 -0
- data/test/system/workarea/storefront/campaign_tracking_test.rb +14 -0
- data/test/system/workarea/storefront/group_test.rb +33 -0
- data/test/system/workarea/storefront/mail_chimp_accounts_system_test.rb +79 -0
- data/test/test_helper.rb +17 -0
- data/test/vcr_cassettes/get_default_list_interests.yml +104 -0
- data/test/vcr_cassettes/get_member_details_no_match.yml +51 -0
- data/test/vcr_cassettes/get_member_details_unsubscribed.yml +51 -0
- data/test/vcr_cassettes/interest_categories_read.yml +104 -0
- data/test/vcr_cassettes/mail_chimp/tasks/create_store-successful.yml +97 -0
- data/test/vcr_cassettes/mc_order_test.yml +381 -0
- data/test/vcr_cassettes/mc_product_test.yml +234 -0
- data/test/vcr_cassettes/subscribe_to_default_list.yml +254 -0
- data/test/vcr_cassettes/subscribe_to_default_list_interest_groups.yml +254 -0
- data/test/vcr_cassettes/subscribe_to_default_list_with_groupings.yml +254 -0
- data/test/vcr_cassettes/subscribe_to_default_list_with_user_details.yml +254 -0
- data/test/vcr_cassettes/unsubscribe_from_default_list.yml +53 -0
- data/test/vcr_cassettes/update_member_on_default_list_change_email.yml +254 -0
- data/test/vcr_cassettes/update_member_on_default_list_change_groupings.yml +254 -0
- data/test/workers/workarea/mail_chimp/ecommerce/save_cart_test.rb +28 -0
- data/test/workers/workarea/mail_chimp/ecommerce/save_order_test.rb +15 -0
- data/test/workers/workarea/mail_chimp/ecommerce/save_product_test.rb +15 -0
- data/workarea-mail_chimp.gemspec +20 -0
- metadata +212 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
module Workarea
|
2
|
+
module MailChimp
|
3
|
+
class ListUnsubscriber
|
4
|
+
include Sidekiq::Worker
|
5
|
+
include Sidekiq::CallbacksWorker
|
6
|
+
|
7
|
+
sidekiq_options(
|
8
|
+
enqueue_on: {
|
9
|
+
Email::Signup => [:destroy],
|
10
|
+
with: -> { [email] }
|
11
|
+
},
|
12
|
+
queue: "low",
|
13
|
+
retry: true
|
14
|
+
)
|
15
|
+
|
16
|
+
def perform(email)
|
17
|
+
User.find_by_email(email)&.update_attributes(email_signup: false)
|
18
|
+
Workarea::MailChimp.gateway.unsubscribe(email)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Workarea
|
2
|
+
module MailChimp
|
3
|
+
class SubscriptionEdit
|
4
|
+
include Sidekiq::Worker
|
5
|
+
include Sidekiq::CallbacksWorker
|
6
|
+
|
7
|
+
sidekiq_options(
|
8
|
+
enqueue_on: {
|
9
|
+
User => [:save],
|
10
|
+
ignore_if: -> { !SubscriptionEdit.should_enqueue?(id) }
|
11
|
+
},
|
12
|
+
queue: "low",
|
13
|
+
retry: true
|
14
|
+
)
|
15
|
+
|
16
|
+
def self.should_enqueue?(id)
|
17
|
+
user = User.find(id)
|
18
|
+
user.email_signup
|
19
|
+
end
|
20
|
+
|
21
|
+
def perform(id)
|
22
|
+
user = User.find(id)
|
23
|
+
|
24
|
+
Workarea::MailChimp.gateway.subscribe(user.email, user: user)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/bin/rails
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails gems
|
3
|
+
# installed from the root of your application.
|
4
|
+
|
5
|
+
ENGINE_ROOT = File.expand_path("../..", __FILE__)
|
6
|
+
ENGINE_PATH = File.expand_path("../../lib/mail_chimp/engine", __FILE__)
|
7
|
+
|
8
|
+
# Set up gems listed in the Gemfile.
|
9
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", __FILE__)
|
10
|
+
require "bundler/setup" if File.exist?(ENV["BUNDLE_GEMFILE"])
|
11
|
+
|
12
|
+
require "rails"
|
13
|
+
require "action_controller/railtie"
|
14
|
+
require "action_view/railtie"
|
15
|
+
require "action_mailer/railtie"
|
16
|
+
require "rails/test_unit/railtie"
|
17
|
+
require "sprockets/railtie"
|
18
|
+
|
19
|
+
require "rails/engine/commands"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Workarea
|
2
|
+
Plugin.append_partials(
|
3
|
+
"storefront.edit_account_details",
|
4
|
+
"workarea/storefront/users/accounts/edit"
|
5
|
+
)
|
6
|
+
|
7
|
+
Plugin.append_partials(
|
8
|
+
"storefront.show_account_details",
|
9
|
+
"workarea/storefront/users/accounts/email_interests"
|
10
|
+
)
|
11
|
+
|
12
|
+
Plugin.append_javascripts(
|
13
|
+
'storefront.modules',
|
14
|
+
'workarea/storefront/mail_chimp/mail_chimp_tracking'
|
15
|
+
)
|
16
|
+
|
17
|
+
Plugin.append_partials(
|
18
|
+
'storefront.javascript',
|
19
|
+
'workarea/storefront/mail_chimp/ecommerce_javascript'
|
20
|
+
)
|
21
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Workarea.configure do |config|
|
2
|
+
config.mail_chimp = ActiveSupport::Configurable::Configuration.new
|
3
|
+
|
4
|
+
config.mail_chimp.default_list_id = ''
|
5
|
+
config.mail_chimp.email_interests_id = ''
|
6
|
+
|
7
|
+
config.mail_chimp.default_store = {
|
8
|
+
id: "" ,
|
9
|
+
list_id: "",
|
10
|
+
name: "Ecommerce Store",
|
11
|
+
email_address: "",
|
12
|
+
currency_code: "USD"
|
13
|
+
}
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
en:
|
2
|
+
workarea:
|
3
|
+
storefront:
|
4
|
+
users:
|
5
|
+
edit:
|
6
|
+
subscribe_to_emails: Subscribe to Emails
|
7
|
+
email_interests: Email Interests
|
8
|
+
email_preferences:
|
9
|
+
email_subscriptions: Email Subscriptions
|
10
|
+
interests: Interests
|
11
|
+
none: None
|
12
|
+
subscribed: Subscribed
|
13
|
+
unsubscribe: Unsubscribe
|
14
|
+
unsubscribed: Unsubscribed
|
15
|
+
update_interests: Update Interests
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Workarea
|
2
|
+
module MailChimp
|
3
|
+
class BogusAPIRequest
|
4
|
+
|
5
|
+
def initialize(builder: nil)
|
6
|
+
@request_builder = builder
|
7
|
+
end
|
8
|
+
|
9
|
+
def post(params: nil, headers: nil, body: nil)
|
10
|
+
Gibbon::Response.new(headers: {}, body: {})
|
11
|
+
end
|
12
|
+
|
13
|
+
def patch(params: nil, headers: nil, body: nil)
|
14
|
+
Gibbon::Response.new(headers: {}, body: {})
|
15
|
+
end
|
16
|
+
|
17
|
+
def put(params: nil, headers: nil, body: nil)
|
18
|
+
Gibbon::Response.new(headers: {}, body: {})
|
19
|
+
end
|
20
|
+
|
21
|
+
def get(params: nil, headers: nil)
|
22
|
+
Gibbon::Response.new(headers: {}, body: {})
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete(params: nil, headers: nil)
|
26
|
+
Gibbon::Response.new(headers: {}, body: {})
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Workarea
|
2
|
+
module MailChimp
|
3
|
+
class BogusGateway
|
4
|
+
delegate :interests, to: :list
|
5
|
+
|
6
|
+
class BogusList
|
7
|
+
def interests
|
8
|
+
[
|
9
|
+
Workarea::MailChimp::Group.new(
|
10
|
+
_id: 9,
|
11
|
+
name: "Email Interests",
|
12
|
+
interests: {
|
13
|
+
"7ca6cc1d86" => "Specials and Promotions",
|
14
|
+
"8911545594" => "Local Events",
|
15
|
+
"542a7ec7bb" => "Restaurant News and Events",
|
16
|
+
"6908d70674" => "Corporate Gifts and Awards"
|
17
|
+
}
|
18
|
+
)
|
19
|
+
]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
@@supported_methods = Workarea::MailChimp::Gateway.public_instance_methods
|
24
|
+
|
25
|
+
def list
|
26
|
+
BogusList.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def method_missing(method, *args)
|
30
|
+
return true if @@supported_methods.include? method
|
31
|
+
super
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Workarea
|
2
|
+
module MailChimp
|
3
|
+
class BogusRequest
|
4
|
+
|
5
|
+
def initialize(*)
|
6
|
+
@path_parts = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def method_missing(method, *args)
|
10
|
+
# To support underscores, we replace them with hyphens when calling the API
|
11
|
+
@path_parts << method.to_s.gsub("_", "-").downcase
|
12
|
+
@path_parts << args if args.length > 0
|
13
|
+
@path_parts.flatten!
|
14
|
+
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def respond_to_missing?(method_name, include_private = false)
|
19
|
+
true
|
20
|
+
end
|
21
|
+
|
22
|
+
def send(*args)
|
23
|
+
if args.length == 0
|
24
|
+
method_missing(:send, args)
|
25
|
+
else
|
26
|
+
__send__(*args)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def path
|
31
|
+
@path_parts.join('/')
|
32
|
+
end
|
33
|
+
|
34
|
+
def create(params: nil, headers: nil, body: nil)
|
35
|
+
BogusAPIRequest.new(builder: self).post(params: params, headers: headers, body: body)
|
36
|
+
reset
|
37
|
+
end
|
38
|
+
|
39
|
+
def update(params: nil, headers: nil, body: nil)
|
40
|
+
BogusAPIRequest.new(builder: self).patch(params: params, headers: headers, body: body)
|
41
|
+
reset
|
42
|
+
end
|
43
|
+
|
44
|
+
def upsert(params: nil, headers: nil, body: nil)
|
45
|
+
BogusAPIRequest.new(builder: self).put(params: params, headers: headers, body: body)
|
46
|
+
reset
|
47
|
+
end
|
48
|
+
|
49
|
+
def retrieve(params: nil, headers: nil)
|
50
|
+
BogusAPIRequest.new(builder: self).get(params: params, headers: headers)
|
51
|
+
reset
|
52
|
+
end
|
53
|
+
|
54
|
+
def delete(params: nil, headers: nil)
|
55
|
+
BogusAPIRequest.new(builder: self).delete(params: params, headers: headers)
|
56
|
+
reset
|
57
|
+
end
|
58
|
+
|
59
|
+
protected
|
60
|
+
|
61
|
+
def reset
|
62
|
+
@path_parts = []
|
63
|
+
end
|
64
|
+
|
65
|
+
class << self
|
66
|
+
attr_accessor :api_key, :timeout, :open_timeout, :api_endpoint, :proxy, :faraday_adapter, :symbolize_keys, :debug, :logger
|
67
|
+
|
68
|
+
def method_missing(sym, *args, &block)
|
69
|
+
new.send(sym, *args, &block)
|
70
|
+
end
|
71
|
+
|
72
|
+
def respond_to_missing?(method_name, include_private = false)
|
73
|
+
true
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Workarea
|
2
|
+
module MailChimp
|
3
|
+
class Gateway
|
4
|
+
class MailChimpSubscriptionError < StandardError; end
|
5
|
+
|
6
|
+
attr_reader :default_list_id, :email_interests_id
|
7
|
+
|
8
|
+
delegate :details, to: :members
|
9
|
+
delegate :interests, to: :list
|
10
|
+
|
11
|
+
def self.acceptable_failure_codes
|
12
|
+
[
|
13
|
+
232, # Email_NotExists
|
14
|
+
220, # List_InvalidImport (banned user / invalid email)
|
15
|
+
400, # Member exists and cannot be subscribed
|
16
|
+
404, # User not found
|
17
|
+
500 # Inexplicable intermittent MailChimp-side error
|
18
|
+
]
|
19
|
+
end
|
20
|
+
|
21
|
+
# Use this for new or current subscriptions
|
22
|
+
#
|
23
|
+
# email: String
|
24
|
+
# new_email: String
|
25
|
+
# user: User
|
26
|
+
#
|
27
|
+
def subscribe(email, options = {})
|
28
|
+
members.subscribe(
|
29
|
+
SubscribeArgumentBuilder.new(
|
30
|
+
email,
|
31
|
+
options,
|
32
|
+
default_list_id,
|
33
|
+
email_interests_id
|
34
|
+
).build
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Unsubscribe email from default list. This does not delete the record in
|
39
|
+
# MailChimp.
|
40
|
+
#
|
41
|
+
# email: String
|
42
|
+
#
|
43
|
+
def unsubscribe(email, options = {})
|
44
|
+
members.unsubscribe(email)
|
45
|
+
end
|
46
|
+
|
47
|
+
def members
|
48
|
+
@members ||= MailChimp::Gateway::Members.new(default_list_id)
|
49
|
+
end
|
50
|
+
|
51
|
+
def list
|
52
|
+
@list ||=
|
53
|
+
MailChimp::Gateway::List.new(
|
54
|
+
default_list_id,
|
55
|
+
email_interests_id
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def acceptable_failure?(error)
|
62
|
+
self.class.acceptable_failure_codes.include?(error.body["status"])
|
63
|
+
end
|
64
|
+
|
65
|
+
def response_error_handler(error)
|
66
|
+
if !acceptable_failure?(error)
|
67
|
+
raise MailChimpSubscriptionError, error.message
|
68
|
+
end
|
69
|
+
|
70
|
+
error_hash(error)
|
71
|
+
end
|
72
|
+
|
73
|
+
def error_hash(error)
|
74
|
+
{ "error" => error.message }
|
75
|
+
end
|
76
|
+
|
77
|
+
def default_list_id
|
78
|
+
Workarea::MailChimp.config.default_list_id
|
79
|
+
end
|
80
|
+
|
81
|
+
def email_interests_id
|
82
|
+
Workarea::MailChimp.config.email_interests_id
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Workarea
|
2
|
+
module MailChimp
|
3
|
+
class Gateway::List < Gateway
|
4
|
+
def initialize(list_id, email_interests_id)
|
5
|
+
@list_id = list_id
|
6
|
+
@email_interests_id = email_interests_id
|
7
|
+
end
|
8
|
+
|
9
|
+
# Get the interest groups for the default list.
|
10
|
+
#
|
11
|
+
def interests
|
12
|
+
begin
|
13
|
+
response = MailChimp.request.lists(@list_id).interest_categories.retrieve
|
14
|
+
|
15
|
+
response.body["categories"].map do |grouping|
|
16
|
+
MailChimp::Group.new(
|
17
|
+
_id: grouping["id"],
|
18
|
+
name: grouping["title"],
|
19
|
+
interests: groupings(grouping["id"])
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
rescue StandardError => e
|
24
|
+
message = "MAIL CHIMP ERROR: Error - #{e}"
|
25
|
+
message += "Response - #{response['error']}" if response.is_a?(Hash)
|
26
|
+
[]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def groupings(category_id)
|
33
|
+
response = MailChimp.request.lists(@list_id).interest_categories(category_id).interests.retrieve
|
34
|
+
|
35
|
+
sort_by_display_order(response.body)
|
36
|
+
end
|
37
|
+
|
38
|
+
def sort_by_display_order(grouping)
|
39
|
+
grouping["interests"].sort do |a, b|
|
40
|
+
a["display_order"].to_i <=> b["display_order"].to_i
|
41
|
+
end.each_with_object({}) do |interest, hash|
|
42
|
+
hash[interest["id"]] = interest["name"]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module Workarea
|
2
|
+
module MailChimp
|
3
|
+
class Gateway::Members < Gateway
|
4
|
+
def initialize( default_list_id)
|
5
|
+
@default_list_id = default_list_id
|
6
|
+
end
|
7
|
+
|
8
|
+
# Returns Hash or nil
|
9
|
+
#
|
10
|
+
def details(email)
|
11
|
+
response ||= begin
|
12
|
+
MailChimp.request.lists(@default_list_id).members(digest_email(email)).retrieve
|
13
|
+
rescue ::Gibbon::MailChimpError => e
|
14
|
+
response_error_handler(e)
|
15
|
+
end
|
16
|
+
|
17
|
+
extract_member_details(response)
|
18
|
+
end
|
19
|
+
|
20
|
+
def unsubscribe(email, options = {})
|
21
|
+
begin
|
22
|
+
MailChimp.request.lists(@default_list_id).members(digest_email(email)).update(body: { status: "unsubscribed" })
|
23
|
+
rescue ::Gibbon::MailChimpError => e
|
24
|
+
response_error_handler(e)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def subscribe(subscribe_argument)
|
29
|
+
return unless subscribe_argument[:email_address]
|
30
|
+
begin
|
31
|
+
MailChimp.request.lists(@default_list_id).members(digest_email(subscribe_argument[:email_address])).upsert(body: subscribe_argument.merge("status" => "subscribed"))
|
32
|
+
rescue ::Gibbon::MailChimpError => e
|
33
|
+
response_error_handler(e)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
# Returns
|
40
|
+
# * Hash of details for subscribed emails
|
41
|
+
# * nil if email does not exist
|
42
|
+
# * nil if email is unsubscribed
|
43
|
+
#
|
44
|
+
def extract_member_details(details)
|
45
|
+
if details["error"].present?
|
46
|
+
nil
|
47
|
+
elsif details["status"] == "unsubscribed"
|
48
|
+
nil
|
49
|
+
else
|
50
|
+
details
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def digest_email(email)
|
55
|
+
md5 = Digest::MD5.new
|
56
|
+
md5.update(email.downcase)
|
57
|
+
md5.hexdigest
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|