class TrailGuide::Adapters::Participants::Unity

Attributes

context[R]
unity[R]

Public Class Methods

new() { |config| ... } click to toggle source
# File lib/trail_guide/adapters/participants/unity.rb, line 9
def initialize(&block)
  configure do |config|
    # TODO make visitor/user configuration more flexible, allow stuff like:
    #
    # config.visitor = -> (context) { context.cookies['visitor_id'] }
    # config.user =    -> (context) { context.current_user.try(:id) }
    config.visitor_cookie = nil
    config.user_id_key = :id

    config.user_adapter = TrailGuide::Adapters::Participants::Redis.configure do |config|
      config.namespace = 'unity:users'
      config.lookup = -> (user_id) { user_id }
      config.expiration = 1.year.seconds
    end

    # TODO use cookie or session adapter by default instead?
    config.visitor_adapter = TrailGuide::Adapters::Participants::Redis.configure do |config|
      config.namespace = 'unity:visitors'
      config.lookup = -> (visitor_id) { visitor_id }
      config.expiration = 1.year.seconds
    end

    config.anonymous_adapter = TrailGuide::Adapters::Participants::Anonymous

    yield(config) if block_given?
  end
end

Public Instance Methods

new(context) click to toggle source
# File lib/trail_guide/adapters/participants/unity.rb, line 37
def new(context)
  @context = context
  @unity = TrailGuide::Unity.new

  if trailguide_context?
    unity.user_id ||= context.send(:try, :trailguide_user).try(configuration.user_id_key)
    unity.visitor_id ||= context.send(:try, :trailguide_visitor)
  end

  if logged_in_context?
    unity.user_id ||= context.send(:current_user).send(configuration.user_id_key)
  end

  if logged_out_context?
    unity.visitor_id ||= context.send(:cookies)[configuration.visitor_cookie]
  end

  unity.sync!
  merge! if unity.synced?

  adapter = configuration.send("#{context_type}_adapter".to_sym)
  if anonymous_context?
    adapter.new(context)
  else
    adapter.new(unity.send("#{context_type}_id".to_sym))
  end
end

Protected Instance Methods

anonymous_context?() click to toggle source
# File lib/trail_guide/adapters/participants/unity.rb, line 115
def anonymous_context?
  !visitor_context? && !user_context?
end
context_type() click to toggle source

TODO introduce Unity::Adapter class, which wraps BOTH/ALL of the configured adapters (either anonymous, visitor, user, or visitor+user) to keep everything in sync between them

# File lib/trail_guide/adapters/participants/unity.rb, line 69
def context_type
  # TODO allow a configuration.preference when both visitor and user context are available?
  if visitor_context?
    return :visitor
  end

  if user_context?
    return :user
  end

  return :anonymous
end
logged_in_context?() click to toggle source
# File lib/trail_guide/adapters/participants/unity.rb, line 96
def logged_in_context?
  context.send(:try, :current_user).present?
end
logged_out_context?() click to toggle source
# File lib/trail_guide/adapters/participants/unity.rb, line 100
def logged_out_context?
  return false unless configuration.visitor_cookie.present?
  context.send(:cookies)[configuration.visitor_cookie].present?
rescue => e
  return false
end
merge!() click to toggle source
# File lib/trail_guide/adapters/participants/unity.rb, line 82
def merge!
  user_adapter = configuration.user_adapter.new(unity.user_id)
  visitor_adapter = configuration.visitor_adapter.new(unity.visitor_id)
  user_adapter.keys.each do |key|
    visitor_adapter[key] = user_adapter[key] unless visitor_adapter[key].present?
  end
  user_adapter.destroy!
end
trailguide_context?() click to toggle source
# File lib/trail_guide/adapters/participants/unity.rb, line 91
def trailguide_context?
  context.send(:try, :trailguide_user).present? ||
    context.send(:try, :trailguide_visitor).present?
end
user_context?() click to toggle source
# File lib/trail_guide/adapters/participants/unity.rb, line 107
def user_context?
  unity.user_id.present?
end
visitor_context?() click to toggle source
# File lib/trail_guide/adapters/participants/unity.rb, line 111
def visitor_context?
  unity.visitor_id.present?
end