Module: Mailkick

Defined in:
lib/mailkick/service/aws_ses.rb,
lib/mailkick.rb,
lib/mailkick/model.rb,
lib/mailkick/engine.rb,
lib/mailkick/service.rb,
lib/mailkick/version.rb,
lib/mailkick/url_helper.rb,
app/models/mailkick/opt_out.rb,
lib/mailkick/service/mailgun.rb,
lib/mailkick/service/mandrill.rb,
lib/mailkick/service/postmark.rb,
lib/mailkick/service/sendgrid.rb,
lib/mailkick/service/mailchimp.rb,
lib/mailkick/service/sendgrid_v2.rb,
lib/generators/mailkick/views_generator.rb,
lib/generators/mailkick/install_generator.rb,
app/controllers/mailkick/subscriptions_controller.rb

Overview

Defined Under Namespace

Modules: Generators, Model, UrlHelper Classes: Engine, OptOut, Service, SubscriptionsController

Constant Summary collapse

VERSION =
"0.4.3"

Class Method Summary collapse

Class Method Details

.discover_servicesObject



33
34
35
36
37
# File 'lib/mailkick.rb', line 33

def self.discover_services
  Service.subclasses.each do |service|
    services << service.new if service.discoverable?
  end
end

.fetch_opt_outsObject



29
30
31
# File 'lib/mailkick.rb', line 29

def self.fetch_opt_outs
  services.each(&:fetch_opt_outs)
end

.generate_token(email, user: nil, list: nil) ⇒ Object

Raises:

  • (ArgumentError)


105
106
107
108
109
110
# File 'lib/mailkick.rb', line 105

def self.generate_token(email, user: nil, list: nil)
  raise ArgumentError, "Missing email" unless email

  user ||= Mailkick.user_method.call(email) if Mailkick.user_method
  message_verifier.generate([email, user.try(:id), user.try(:class).try(:name), list])
end

.message_verifierObject



101
102
103
# File 'lib/mailkick.rb', line 101

def self.message_verifier
  @message_verifier ||= ActiveSupport::MessageVerifier.new(Mailkick.secret_token)
end

.opt_in(options) ⇒ Object



58
59
60
61
62
63
64
# File 'lib/mailkick.rb', line 58

def self.opt_in(options)
  opt_outs(options).each do |opt_out|
    opt_out.active = false
    opt_out.save!
  end
  true
end

.opt_out(options) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/mailkick.rb', line 43

def self.opt_out(options)
  unless opted_out?(options)
    time = options[:time] || Time.now
    Mailkick::OptOut.create! do |o|
      o.email = options[:email]
      o.user = options[:user]
      o.reason = options[:reason] || "unsubscribe"
      o.list = options[:list]
      o.created_at = time
      o.updated_at = time
    end
  end
  true
end

.opt_outs(options = {}) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/mailkick.rb', line 66

def self.opt_outs(options = {})
  relation = Mailkick::OptOut.where(active: true)

  contact_relation = Mailkick::OptOut.none
  if (email = options[:email])
    contact_relation = contact_relation.or(Mailkick::OptOut.where(email: email))
  end
  if (user = options[:user])
    contact_relation = contact_relation.or(
      Mailkick::OptOut.where("user_id = ? AND user_type = ?", user.id, user.class.name)
    )
  end
  relation = relation.merge(contact_relation) if email || user

  relation =
    if options[:list]
      relation.where("list IS NULL OR list = ?", options[:list])
    else
      relation.where("list IS NULL")
    end

  relation
end

.opted_out?(options) ⇒ Boolean

Returns:

  • (Boolean)


39
40
41
# File 'lib/mailkick.rb', line 39

def self.opted_out?(options)
  opt_outs(options).any?
end

.opted_out_emails(options = {}) ⇒ Object

TODO use keyword arguments



91
92
93
# File 'lib/mailkick.rb', line 91

def self.opted_out_emails(options = {})
  Set.new(opt_outs(options).where.not(email: nil).distinct.pluck(:email))
end

.opted_out_users(options = {}) ⇒ Object

TODO use keyword arguments does not take into account emails



97
98
99
# File 'lib/mailkick.rb', line 97

def self.opted_out_users(options = {})
  Set.new(opt_outs(options).where.not(user_id: nil).map(&:user))
end