module UniversalTrackManagerConcern

Attributes

visit_evicted[RW]

Public Instance Methods

any_utm_params?() click to toggle source
# File lib/universal_track_manager/controllers/concerns/universal_track_manager_concern.rb, line 72
def any_utm_params?
  return false if ! UniversalTrackManager.track_utms?
  UniversalTrackManager.campaign_column_symbols.any? do |key|
    params[key].present?
  end
end
evict_visit!(old_visit) click to toggle source
# File lib/universal_track_manager/controllers/concerns/universal_track_manager_concern.rb, line 98
def evict_visit!(old_visit)
  @visit_evicted = true
  params = {
    first_pageload: now,
    last_pageload: now,
    original_visit_id: old_visit.original_visit_id.nil? ?  old_visit.id : old_visit.original_visit_id,
    ip_v4_address: ip_address,
    campaign: find_or_create_campaign_by_current
  }

  # fail silently if there is no user agent
  params[:browser] =  find_or_create_browser_by_current if request.user_agent
  visit = UniversalTrackManager::Visit.create!(params)

  session[:visit_id] = visit.id
end
find_or_create_browser_by_current() click to toggle source
# File lib/universal_track_manager/controllers/concerns/universal_track_manager_concern.rb, line 79
def find_or_create_browser_by_current
  return nil if ! UniversalTrackManager.track_user_agent?
  browser = UniversalTrackManager::Browser.find_or_create_by(name: user_agent)
end
find_or_create_campaign_by_current() click to toggle source
# File lib/universal_track_manager/controllers/concerns/universal_track_manager_concern.rb, line 84
def find_or_create_campaign_by_current
  return nil if ! UniversalTrackManager.track_utms?
  gen_sha1 = gen_campaign_key(permitted_utm_params)

  # find_or_create_by finding only by sha1 would be nice here, but how to do so with a dynamic set of columns?
  # we've got a small chance of dups here due to the non-atomic find/create and sha1, but that's ok for this application.
  c = UniversalTrackManager::Campaign.find_by(sha1: gen_sha1)
  c ||= UniversalTrackManager::Campaign.create(*(permitted_utm_params.merge({"sha1": gen_sha1})))
end
gen_campaign_key(params) click to toggle source
# File lib/universal_track_manager/controllers/concerns/universal_track_manager_concern.rb, line 94
def gen_campaign_key(params)
  Digest::SHA1.hexdigest(params.keys.map{|k| k.downcase()}.sort.map{|k| {"#{k}":  params[k]}}.to_s)
end
ip_address() click to toggle source
# File lib/universal_track_manager/controllers/concerns/universal_track_manager_concern.rb, line 23
def ip_address
  return nil if ! UniversalTrackManager.track_ips?
  request.ip
end
new_visitor() click to toggle source
# File lib/universal_track_manager/controllers/concerns/universal_track_manager_concern.rb, line 37
def new_visitor
  params = {
    first_pageload: now,
    last_pageload: now,
    ip_v4_address: ip_address,
    campaign: find_or_create_campaign_by_current
  }
  params[:browser] =  find_or_create_browser_by_current if request.user_agent
  visit = UniversalTrackManager::Visit.create!(params)
  session[:visit_id] = visit.id
end
now() click to toggle source
# File lib/universal_track_manager/controllers/concerns/universal_track_manager_concern.rb, line 33
def now
  @now ||= Time.now
end
permitted_utm_params() click to toggle source
# File lib/universal_track_manager/controllers/concerns/universal_track_manager_concern.rb, line 18
def permitted_utm_params
  params.permit(*(UniversalTrackManager.campaign_column_symbols))
end
track_visitor() click to toggle source
# File lib/universal_track_manager/controllers/concerns/universal_track_manager_concern.rb, line 49
def track_visitor
  if !session['visit_id']
    new_visitor
  else
    # existing visit
    begin
      existing_visit = UniversalTrackManager::Visit.find(session['visit_id'])

      evict_visit!(existing_visit) if any_utm_params? && !existing_visit.matches_all_utms?(permitted_utm_params)

      evict_visit!(existing_visit) if existing_visit.ip_v4_address != ip_address
      evict_visit!(existing_visit) if existing_visit.browser && existing_visit.browser.name != user_agent

      existing_visit.update_columns(:last_pageload => Time.now) if !@visit_evicted
    rescue ActiveRecord::RecordNotFound
      # this happens if the session table is cleared or if the record in the session
      # table points to a visit that has been cleared
      new_visitor
    end
  end
end
user_agent() click to toggle source
# File lib/universal_track_manager/controllers/concerns/universal_track_manager_concern.rb, line 28
def user_agent
  return nil if ! UniversalTrackManager.track_user_agent?
  request.user_agent[0..254]
end