88 lines
2.8 KiB
Ruby
88 lines
2.8 KiB
Ruby
|
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
|