class RailsBase::Admin::ActionCache

Constants

KEY_BASE
LAST_VIEWED_BASE
LV_TTL
TTL_FOR_CACHE
VALID_TIME_OBJECT

Attributes

redis[R]

Public Class Methods

new() click to toggle source
# File lib/rails_base/admin/action_cache.rb, line 17
def initialize
  url = RailsBase.config.redis.admin_action
  namespace = RailsBase.config.redis.admin_action_namespace
  client = Redis.new(url: url)
  @redis = Redis::Namespace.new(namespace, redis_url: client)
  @logger = Rails.logger
end

Public Instance Methods

actions_since(user:, alltime: false, time: nil) click to toggle source
# File lib/rails_base/admin/action_cache.rb, line 35
def actions_since(user:, alltime: false, time: nil)
  score =
    if alltime
      0
    else
      valid_time!(time)
      score = time.to_f
    end

  validate_user!(user)
  max_score = Time.now.to_f
  @logger.info { "Retrieving Redis Cache Admin actions for #{key(user)} since #{time}" }

  redis.zrangebyscore(key(user), score, max_score, with_scores: true)
end
add_action(user:, msg:, occured:) click to toggle source
# File lib/rails_base/admin/action_cache.rb, line 25
def add_action(user:, msg:, occured:)
  validate!(user, msg, occured)

  score = occured.to_f
  @logger.info { "Adding Redis Cache Admin actions for #{key(user)}" }

  redis.zadd(key(user), score, msg)
  redis.expire(key(user), TTL_FOR_CACHE.to_i)
end
delete_actions_since!(user:, time:) click to toggle source
# File lib/rails_base/admin/action_cache.rb, line 51
def delete_actions_since!(user:, time:)
  valid_time!(time)
  validate_user!(user)

  score = time.to_f
  redis.zremrangebyscore(key(user), 0, score)
  @logger.info { "Deleted Redis Cache Admin actions for #{key(user)}" }
  true
end
get_last_viewed(user:) click to toggle source
# File lib/rails_base/admin/action_cache.rb, line 68
def get_last_viewed(user:)
  validate_user!(user)

  redis.get(key_last_viewed(user))
end
update_last_viewed(user:, time: Time.zone.now) click to toggle source
# File lib/rails_base/admin/action_cache.rb, line 61
def update_last_viewed(user:, time: Time.zone.now)
  valid_time!(time)
  validate_user!(user)

  redis.set(key_last_viewed(user), time.to_f, ex: LV_TTL)
end

Private Instance Methods

key(user) click to toggle source
# File lib/rails_base/admin/action_cache.rb, line 95
def key(user)
  "#{KEY_BASE}:#{user.id}"
end
key_last_viewed(user) click to toggle source
# File lib/rails_base/admin/action_cache.rb, line 91
def key_last_viewed(user)
  "#{key(user)}:#{LAST_VIEWED_BASE}"
end
valid_time!(time) click to toggle source
# File lib/rails_base/admin/action_cache.rb, line 87
def valid_time!(time)
  raise ArgumentError, "Expected occured to be a #{VALID_TIME_OBJECT.join(' or ')}" unless VALID_TIME_OBJECT.include?(time.class)
end
validate!(user, msg, occured) click to toggle source
# File lib/rails_base/admin/action_cache.rb, line 76
def validate!(user, msg, occured)
  raise ArgumentError, 'Expected msg to be a string' unless msg.is_a?(String)

  validate_user!(user)
  valid_time!(occured)
end
validate_user!(user) click to toggle source
# File lib/rails_base/admin/action_cache.rb, line 83
def validate_user!(user)
  raise ArgumentError, 'Expected user to respond to `id`' unless user.respond_to?('id')
end