mirror of
https://github.com/mastodon/mastodon
synced 2024-12-17 16:18:21 +09:00
37 lines
727 B
Ruby
37 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
|