forked from Trustie/forgeplus
66 lines
1.2 KiB
Ruby
66 lines
1.2 KiB
Ruby
class LimitForbidControl::Base
|
|
def initialize
|
|
end
|
|
|
|
def cache_key
|
|
raise 'Please overwrite method :cache_Key'
|
|
end
|
|
|
|
def forbid_cache_key
|
|
"#{cache_key}:forbid"
|
|
end
|
|
|
|
def allow_times
|
|
5
|
|
end
|
|
|
|
def cumulative_expires
|
|
1.days
|
|
end
|
|
|
|
def forbid_expires
|
|
1.hours
|
|
end
|
|
|
|
def forbid?
|
|
Rails.cache.read(forbid_cache_key)
|
|
end
|
|
|
|
def increment!
|
|
value = Rails.cache.read(cache_key)
|
|
value = value.to_i + 1
|
|
|
|
# 锁定
|
|
if value >= allow_times.to_i
|
|
Rails.logger.info("[LimitForbidControl] Lock #{cache_key}")
|
|
Rails.cache.write(forbid_cache_key, true, expires_in: forbid_expires)
|
|
Rails.cache.delete(cache_key)
|
|
else
|
|
Rails.cache.write(cache_key, value, expires_in: cumulative_expires)
|
|
end
|
|
end
|
|
|
|
def error_times
|
|
Rails.cache.read(cache_key).to_i
|
|
end
|
|
|
|
def remain_times
|
|
allow_times.to_i - error_times
|
|
end
|
|
|
|
def clear
|
|
Rails.logger.info("[LimitForbidControl] Clear #{cache_key}")
|
|
Rails.cache.delete(forbid_cache_key)
|
|
Rails.cache.delete(cache_key)
|
|
end
|
|
|
|
private
|
|
|
|
def redis_cache?
|
|
Rails.cache.is_a?(ActiveSupport::Cache::RedisStore)
|
|
end
|
|
|
|
def day
|
|
Time.current.strftime('%Y%m%d')
|
|
end
|
|
end |