cartodb/app/models/carto/rate_limit.rb

88 lines
2.8 KiB
Ruby
Raw Normal View History

2020-06-15 10:58:47 +08:00
module Carto
class RateLimit < ActiveRecord::Base
RATE_LIMIT_ATTRIBUTES = [:maps_anonymous,
:maps_static,
:maps_static_named,
:maps_dataview,
:maps_dataview_search,
:maps_analysis,
:maps_tile,
:maps_attributes,
:maps_named_list,
:maps_named_create,
:maps_named_get,
:maps_named,
:maps_named_update,
:maps_named_delete,
:maps_named_tiles,
:maps_analysis_catalog,
:sql_query,
:sql_query_format,
:sql_job_create,
:sql_job_get,
:sql_job_delete,
:sql_copy_from,
:sql_copy_to].freeze
RATE_LIMIT_ATTRIBUTES.each { |attr| serialize attr, RateLimitValues }
RATE_LIMIT_ATTRIBUTES.each { |attr| validates attr, presence: true }
# FIXME remove this after syncing rate_limits
RATE_LIMIT_DEFAULTS = {
sql_copy_from: [1, 1, 60],
sql_copy_to: [1, 1, 60]
}.freeze
###
def self.from_api_attributes(attributes)
rate_limit = RateLimit.new
rate_limit.rate_limit_attributes(attributes).each { |k, v| rate_limit[k] = RateLimitValues.new(v) }
rate_limit
end
def to_redis
result = {}
RATE_LIMIT_ATTRIBUTES.each do |key|
result[key.to_s.sub('_', ':')] = self[key].to_redis_array
end
result
end
def save_to_redis(user)
raise ActiveRecord::RecordInvalid.new(self) unless valid?
to_redis.each do |key, value|
$limits_metadata.DEL "limits:rate:store:#{user.username}:#{key}"
$limits_metadata.RPUSH "limits:rate:store:#{user.username}:#{key}", value
end
end
def api_attributes
RATE_LIMIT_ATTRIBUTES.map { |attr| [attr.to_sym, self[attr].to_array] }.to_h
end
def destroy_completely(user)
destroy
delete_from_redis(user)
end
def delete_from_redis(user)
to_redis.each_key do |key|
$limits_metadata.DEL "limits:rate:store:#{user.username}:#{key}"
end
end
def rate_limit_attributes(attrs = attributes)
attrs.with_indifferent_access.slice(*Carto::RateLimit::RATE_LIMIT_ATTRIBUTES)
.reverse_merge!(RATE_LIMIT_DEFAULTS) # FIXME remove this after syncing rate_limits
end
def ==(rate_limit)
super(rate_limit) ||
rate_limit_attributes.lazy.zip(rate_limit.rate_limit_attributes).all? do |x, y|
x == y
end
end
end
end