36 lines
727 B
Ruby
36 lines
727 B
Ruby
# frozen_string_literal: true
|
|
|
|
module RateLimitable
|
|
extend ActiveSupport::Concern
|
|
|
|
def rate_limit=(value)
|
|
@rate_limit = value
|
|
end
|
|
|
|
def rate_limit?
|
|
@rate_limit
|
|
end
|
|
|
|
def rate_limiter(by, options = {})
|
|
return @rate_limiter if defined?(@rate_limiter)
|
|
|
|
@rate_limiter = RateLimiter.new(by, options)
|
|
end
|
|
|
|
class_methods do
|
|
def rate_limit(options = {})
|
|
after_create do
|
|
by = public_send(options[:by])
|
|
|
|
if rate_limit? && by&.local?
|
|
rate_limiter(by, options).record!
|
|
@rate_limit_recorded = true
|
|
end
|
|
end
|
|
|
|
after_rollback do
|
|
rate_limiter(public_send(options[:by]), options).rollback! if @rate_limit_recorded
|
|
end
|
|
end
|
|
end
|
|
end
|