class AhoyEmail::RedisSubscriber

Attributes

prefix[R]
redis[R]

Public Class Methods

new(redis: nil, prefix: "ahoy_email") click to toggle source
# File lib/ahoy_email/redis_subscriber.rb, line 5
def initialize(redis: nil, prefix: "ahoy_email")
  @redis = redis || Redis.new
  @prefix = prefix
end

Public Instance Methods

campaign_exists?(campaign) click to toggle source
# File lib/ahoy_email/redis_subscriber.rb, line 44
def campaign_exists?(campaign)
  redis.sismember(campaigns_key, campaign)
end
campaigns() click to toggle source
# File lib/ahoy_email/redis_subscriber.rb, line 40
def campaigns
  redis.smembers(campaigns_key)
end
stats(campaign = nil) click to toggle source
# File lib/ahoy_email/redis_subscriber.rb, line 26
def stats(campaign = nil)
  if campaign
    # return nil instead of zeros if not a campaign
    if campaign_exists?(campaign)
      campaign_stats(campaign)
    end
  else
    campaigns.inject({}) do |memo, campaign|
      memo[campaign] = campaign_stats(campaign)
      memo
    end
  end
end
track_click(event) click to toggle source
# File lib/ahoy_email/redis_subscriber.rb, line 18
def track_click(event)
  campaign_prefix = campaign_key(event[:campaign])
  pipelined do |pipeline|
    pipeline.incr("#{campaign_prefix}:clicks")
    pipeline.pfadd("#{campaign_prefix}:unique_clicks", event[:token])
  end
end
track_send(event) click to toggle source
# File lib/ahoy_email/redis_subscriber.rb, line 10
def track_send(event)
  campaign_prefix = campaign_key(event[:campaign])
  pipelined do |pipeline|
    pipeline.incr("#{campaign_prefix}:sends")
    pipeline.sadd(campaigns_key, event[:campaign])
  end
end

Private Instance Methods

campaign_key(campaign) click to toggle source
# File lib/ahoy_email/redis_subscriber.rb, line 54
def campaign_key(campaign)
  "#{prefix}:campaigns:#{campaign}"
end
campaign_stats(campaign) click to toggle source
# File lib/ahoy_email/redis_subscriber.rb, line 58
def campaign_stats(campaign)
  # scope
  sends = nil
  clicks = nil
  unique_clicks = nil

  campaign_prefix = campaign_key(campaign)
  pipelined do |pipeline|
    sends = pipeline.get("#{campaign_prefix}:sends")
    clicks = pipeline.get("#{campaign_prefix}:clicks")
    unique_clicks = pipeline.pfcount("#{campaign_prefix}:unique_clicks")
  end

  {
    sends: sends.value.to_i,
    clicks: clicks.value.to_i,
    unique_clicks: unique_clicks.value,
    ctr: 100 * unique_clicks.value / sends.value.to_f
  }
end
campaigns_key() click to toggle source
# File lib/ahoy_email/redis_subscriber.rb, line 50
def campaigns_key
  "#{prefix}:campaigns"
end
pipelined() { |pipeline| ... } click to toggle source
# File lib/ahoy_email/redis_subscriber.rb, line 79
def pipelined
  if Redis::VERSION.to_f >= 4.6
    redis.pipelined do |pipeline|
      yield pipeline
    end
  else
    redis.pipelined do
      yield redis
    end
  end
end