Sha256: 41f1bd4befe57df77c23458b0086977a97cad39b8d38793fc05e0ffafc9fced4

Contents?: true

Size: 1.85 KB

Versions: 2

Compression:

Stored size: 1.85 KB

Contents

module RateLimiter
  module Model
    def self.included(base)
      base.send :extend, ClassMethods
    end

    module ClassMethods
      def rate_limit(options = {})
        send :include, InstanceMethods

        class_attribute :rate_limit_on
        self.rate_limit_on = options[:on] || :ip_address

        class_attribute :rate_limit_interval
        self.rate_limit_interval = options[:interval] || 1.minute

        class_attribute :rate_limit_if_condition
        self.rate_limit_if_condition = options[:if]

        class_attribute :rate_limit_unless_condition
        self.rate_limit_unless_condition = options[:unless]

        class_attribute :rate_limit_enabled_for_model
        self.rate_limit_enabled_for_model = true

        self.before_create :check_rate_limit
      end

      def rate_limit_off
        self.rate_limit_enabled_for_model = false
      end

      def rate_limit_on
        self.rate_limit_enabled_for_model = true
      end
    end

    module InstanceMethods
      def check_rate_limit
        if switched_on? && rate_limit?
          klass = self.class

          others = klass.where("#{klass.rate_limit_on.to_s} = ? AND #{RateLimiter.config.timestamp_field.to_s} >= ?", self.send(klass.rate_limit_on), Time.now - klass.rate_limit_interval)

          if others.present?
            # TODO: Come up with a better error message.
            self.errors.add(:base, "You cannot create a new #{klass.name.downcase} yet.")

            false
          else
            true
          end
        else
          true
        end
      end

      def switched_on?
        RateLimiter.enabled? && RateLimiter.enabled_for_controller? && self.class.rate_limit_enabled_for_model
      end

      def rate_limit?
        (rate_limit_if_condition.blank? || rate_limit_if_condition.call(self)) && !rate_limit_unless_condition.try(:call, self)
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rate_limiter-0.0.6 lib/rate_limiter/model.rb
rate_limiter-0.0.5 lib/rate_limiter/model.rb