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
							 |