Module: EffectiveMailchimpUser

Extended by:
ActiveSupport::Concern
Defined in:
app/models/concerns/effective_mailchimp_user.rb

Overview

EffectiveMailchimpUser

Mark your user model with effective_mailchimp_user to get a few helpers And user specific point required scores

Defined Under Namespace

Modules: Base, ClassMethods

Instance Method Summary collapse

Instance Method Details

#build_mailchimp_list_member(mailchimp_list:) ⇒ Object

Find or build



42
43
44
45
# File 'app/models/concerns/effective_mailchimp_user.rb', line 42

def build_mailchimp_list_member(mailchimp_list:)
  raise('expected a MailchimpList') unless mailchimp_list.kind_of?(Effective::MailchimpList)
  mailchimp_list_member(mailchimp_list: mailchimp_list) || mailchimp_list_members.build(mailchimp_list: mailchimp_list)
end

#mailchimp_last_synced_atObject



51
52
53
# File 'app/models/concerns/effective_mailchimp_user.rb', line 51

def mailchimp_last_synced_at
  mailchimp_list_members.map(&:last_synced_at).min
end

#mailchimp_list_member(mailchimp_list:) ⇒ Object



36
37
38
39
# File 'app/models/concerns/effective_mailchimp_user.rb', line 36

def mailchimp_list_member(mailchimp_list:)
  raise('expected a MailchimpList') unless mailchimp_list.kind_of?(Effective::MailchimpList)
  mailchimp_list_members.find { |mlm| mlm.mailchimp_list_id == mailchimp_list.id }
end

#mailchimp_list_members_changed?Boolean

Returns:

  • (Boolean)


47
48
49
# File 'app/models/concerns/effective_mailchimp_user.rb', line 47

def mailchimp_list_members_changed?
  mailchimp_list_members.any? { |mlm| mlm.changes.present? || mlm.marked_for_destruction? }
end

#mailchimp_member_update_required?(member) ⇒ Boolean

Returns:

  • (Boolean)


104
105
106
107
108
109
110
111
112
113
114
# File 'app/models/concerns/effective_mailchimp_user.rb', line 104

def mailchimp_member_update_required?(member)
  require_update = ['email', 'last_name', 'first_name']

  return true if (changes.keys & require_update).present?
  return true if (previous_changes.keys & require_update).present?

  return true if member.changes.present?
  return true if member.previous_changes.present?

  false
end

#mailchimp_subscribed_listsObject



32
33
34
# File 'app/models/concerns/effective_mailchimp_user.rb', line 32

def mailchimp_subscribed_lists
  mailchimp_list_members.select(&:subscribed?).map(&:mailchimp_list)
end

#mailchimp_sync!(force: true) ⇒ Object

Pulls the current status from Mailchimp API into the Mailchimp List Member objects Run before the mailchimp fields are displayed



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'app/models/concerns/effective_mailchimp_user.rb', line 62

def mailchimp_sync!(force: true)
  api = EffectiveMailchimp.api
  lists = Effective::MailchimpList.subscribable.sorted.to_a

  return if lists.length == mailchimp_list_members.length && !(force || mailchimp_sync_required?)

  lists.each do |mailchimp_list|
    member = build_mailchimp_list_member(mailchimp_list: mailchimp_list)

    list_member = api.list_member(mailchimp_list, email) || {}
    member.assign_mailchimp_attributes(list_member)
  end

  mailchimp_list_members.each do |member|
    list = lists.find { |list| list.id == member.mailchimp_list_id }
    member.mark_for_destruction unless list.present?
  end

  save! if mailchimp_list_members_changed?
  true
end

#mailchimp_sync_required?Boolean

Returns:

  • (Boolean)


55
56
57
58
# File 'app/models/concerns/effective_mailchimp_user.rb', line 55

def mailchimp_sync_required?
  return true if mailchimp_last_synced_at.blank?
  mailchimp_last_synced_at < (Time.zone.now - 1.day)
end

#mailchimp_update!(force: true) ⇒ Object

Pushes the current Mailchimp List Member objects to Mailchimp when needed



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'app/models/concerns/effective_mailchimp_user.rb', line 85

def mailchimp_update!(force: true)
  api = EffectiveMailchimp.api

  assign_attributes(mailchimp_user_form_action: nil)

  mailchimp_list_members.map do |member|
    if member.mailchimp_id.blank? && member.subscribed?
      list_member = api.list_member_add(member)
      member.assign_mailchimp_attributes(list_member)
    elsif member.mailchimp_id.present? && (force || mailchimp_member_update_required?(member))
      list_member = api.list_member_update(member)
      member.assign_mailchimp_attributes(list_member)
    end
  end

  save! if mailchimp_list_members_changed?
  true
end