parent
936c2ec7e2
commit
8b659de73d
5 changed files with 30 additions and 27 deletions
|
@ -2,15 +2,15 @@ Rails.application.reloader.to_prepare do
|
||||||
# Alfred
|
# Alfred
|
||||||
# Add here as you use it for more features
|
# Add here as you use it for more features
|
||||||
# Used for Round Robin, Conversation Emails & Online Presence
|
# Used for Round Robin, Conversation Emails & Online Presence
|
||||||
$alfred = ConnectionPool::Wrapper.new(size: 5, timeout: 3) do
|
$alfred = ConnectionPool.new(size: 5, timeout: 3) do
|
||||||
redis = Rails.env.test? ? MockRedis.new : Redis.new(Redis::Config.app)
|
redis = Rails.env.test? ? MockRedis.new : Redis.new(Redis::Config.app)
|
||||||
Redis::Namespace.new('alfred', redis: redis, warning: true)
|
Redis::Namespace.new('alfred', redis: redis, warning: true)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Velma : Determined protector
|
# Velma : Determined protector
|
||||||
# used in rack attack
|
# used in rack attack
|
||||||
$velma = ConnectionPool::Wrapper.new(size: 5, timeout: 3) do
|
$velma = ConnectionPool.new(size: 5, timeout: 3) do
|
||||||
redis = Rails.env.test? ? MockRedis.new : Redis.new(Redis::Config.app)
|
config = Rails.env.test? ? MockRedis.new : Redis.new(Redis::Config.app)
|
||||||
Redis::Namespace.new('velma', redis: redis, warning: true)
|
Redis::Namespace.new('velma', redis: config, warning: true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,7 +11,7 @@ class Rack::Attack
|
||||||
# Rack::Attack.cache.store = ActiveSupport::Cache::MemoryStore.new
|
# Rack::Attack.cache.store = ActiveSupport::Cache::MemoryStore.new
|
||||||
|
|
||||||
# https://github.com/rack/rack-attack/issues/102
|
# https://github.com/rack/rack-attack/issues/102
|
||||||
Rack::Attack.cache.store = Rack::Attack::StoreProxy::RedisProxy.new($velma)
|
Rack::Attack.cache.store = ActiveSupport::Cache::RedisCacheStore.new(redis: $velma)
|
||||||
|
|
||||||
class Request < ::Rack::Request
|
class Request < ::Rack::Request
|
||||||
# You many need to specify a method to fetch the correct remote IP address
|
# You many need to specify a method to fetch the correct remote IP address
|
||||||
|
|
|
@ -20,9 +20,9 @@ class GlobalConfig
|
||||||
end
|
end
|
||||||
|
|
||||||
def clear_cache
|
def clear_cache
|
||||||
cached_keys = $alfred.keys("#{VERSION}:#{KEY_PREFIX}:*")
|
cached_keys = $alfred.with { |conn| conn.keys("#{VERSION}:#{KEY_PREFIX}:*") }
|
||||||
(cached_keys || []).each do |cached_key|
|
(cached_keys || []).each do |cached_key|
|
||||||
$alfred.expire(cached_key, 0)
|
$alfred.with { |conn| conn.expire(cached_key, 0) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -30,12 +30,12 @@ class GlobalConfig
|
||||||
|
|
||||||
def load_from_cache(config_key)
|
def load_from_cache(config_key)
|
||||||
cache_key = "#{VERSION}:#{KEY_PREFIX}:#{config_key}"
|
cache_key = "#{VERSION}:#{KEY_PREFIX}:#{config_key}"
|
||||||
cached_value = $alfred.get(cache_key)
|
cached_value = $alfred.with { |conn| conn.get(cache_key) }
|
||||||
|
|
||||||
if cached_value.blank?
|
if cached_value.blank?
|
||||||
value_from_db = db_fallback(config_key)
|
value_from_db = db_fallback(config_key)
|
||||||
cached_value = { value: value_from_db }.to_json
|
cached_value = { value: value_from_db }.to_json
|
||||||
$alfred.set(cache_key, cached_value, { ex: DEFAULT_EXPIRY })
|
$alfred.with { |conn| conn.set(cache_key, cached_value, { ex: DEFAULT_EXPIRY }) }
|
||||||
end
|
end
|
||||||
|
|
||||||
JSON.parse(cached_value)['value']
|
JSON.parse(cached_value)['value']
|
||||||
|
|
|
@ -8,92 +8,92 @@ module Redis::Alfred
|
||||||
|
|
||||||
# set a value in redis
|
# set a value in redis
|
||||||
def set(key, value)
|
def set(key, value)
|
||||||
$alfred.set(key, value)
|
$alfred.with { |conn| conn.set(key, value) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# set a key with expiry period
|
# set a key with expiry period
|
||||||
def setex(key, value, expiry = 1.day)
|
def setex(key, value, expiry = 1.day)
|
||||||
$alfred.setex(key, expiry, value)
|
$alfred.with { |conn| conn.setex(key, expiry, value) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def get(key)
|
def get(key)
|
||||||
$alfred.get(key)
|
$alfred.with { |conn| conn.get(key) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete(key)
|
def delete(key)
|
||||||
$alfred.del(key)
|
$alfred.with { |conn| conn.del(key) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# increment a key by 1. throws error if key value is incompatible
|
# increment a key by 1. throws error if key value is incompatible
|
||||||
# sets key to 0 before operation if key doesn't exist
|
# sets key to 0 before operation if key doesn't exist
|
||||||
def incr(key)
|
def incr(key)
|
||||||
$alfred.incr(key)
|
$alfred.with { |conn| conn.incr(key) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# list operations
|
# list operations
|
||||||
|
|
||||||
def llen(key)
|
def llen(key)
|
||||||
$alfred.llen(key)
|
$alfred.with { |conn| conn.llen(key) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def lrange(key, start_index = 0, end_index = -1)
|
def lrange(key, start_index = 0, end_index = -1)
|
||||||
$alfred.lrange(key, start_index, end_index)
|
$alfred.with { |conn| conn.lrange(key, start_index, end_index) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def rpop(key)
|
def rpop(key)
|
||||||
$alfred.rpop(key)
|
$alfred.with { |conn| conn.rpop(key) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def lpush(key, values)
|
def lpush(key, values)
|
||||||
$alfred.lpush(key, values)
|
$alfred.with { |conn| conn.lpush(key, values) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def rpoplpush(source, destination)
|
def rpoplpush(source, destination)
|
||||||
$alfred.rpoplpush(source, destination)
|
$alfred.with { |conn| conn.rpoplpush(source, destination) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def lrem(key, value, count = 0)
|
def lrem(key, value, count = 0)
|
||||||
$alfred.lrem(key, count, value)
|
$alfred.with { |conn| conn.lrem(key, count, value) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# hash operations
|
# hash operations
|
||||||
|
|
||||||
# add a key value to redis hash
|
# add a key value to redis hash
|
||||||
def hset(key, field, value)
|
def hset(key, field, value)
|
||||||
$alfred.hset(key, field, value)
|
$alfred.with { |conn| conn.hset(key, field, value) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# get value from redis hash
|
# get value from redis hash
|
||||||
def hget(key, field)
|
def hget(key, field)
|
||||||
$alfred.hget(key, field)
|
$alfred.with { |conn| conn.hget(key, field) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# get values of multiple keys from redis hash
|
# get values of multiple keys from redis hash
|
||||||
def hmget(key, fields)
|
def hmget(key, fields)
|
||||||
$alfred.hmget(key, *fields)
|
$alfred.with { |conn| conn.hmget(key, *fields) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# sorted set operations
|
# sorted set operations
|
||||||
|
|
||||||
# add score and value for a key
|
# add score and value for a key
|
||||||
def zadd(key, score, value)
|
def zadd(key, score, value)
|
||||||
$alfred.zadd(key, score, value)
|
$alfred.with { |conn| conn.zadd(key, score, value) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# get score of a value for key
|
# get score of a value for key
|
||||||
def zscore(key, value)
|
def zscore(key, value)
|
||||||
$alfred.zscore(key, value)
|
$alfred.with { |conn| conn.zscore(key, value) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# get values by score
|
# get values by score
|
||||||
def zrangebyscore(key, range_start, range_end)
|
def zrangebyscore(key, range_start, range_end)
|
||||||
$alfred.zrangebyscore(key, range_start, range_end)
|
$alfred.with { |conn| conn.zrangebyscore(key, range_start, range_end) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# remove values by score
|
# remove values by score
|
||||||
# exclusive score is specified by prefixing (
|
# exclusive score is specified by prefixing (
|
||||||
def zremrangebyscore(key, range_start, range_end)
|
def zremrangebyscore(key, range_start, range_end)
|
||||||
$alfred.zremrangebyscore(key, range_start, range_end)
|
$alfred.with { |conn| conn.zremrangebyscore(key, range_start, range_end) }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -111,6 +111,9 @@ RSpec.describe 'CSAT Survey Responses API', type: :request do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'filters csat metrics based on a date range' do
|
it 'filters csat metrics based on a date range' do
|
||||||
|
# clearing any existing csat responses
|
||||||
|
CsatSurveyResponse.destroy_all
|
||||||
|
|
||||||
create(:csat_survey_response, account: account, created_at: 10.days.ago)
|
create(:csat_survey_response, account: account, created_at: 10.days.ago)
|
||||||
create(:csat_survey_response, account: account, created_at: 3.days.ago)
|
create(:csat_survey_response, account: account, created_at: 3.days.ago)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue