FHG-IMW/epo-ops

View on GitHub
lib/epo_ops/rate_limit.rb

Summary

Maintainability
A
0 mins
Test Coverage
module EpoOps
  class RateLimit
    WEEKLY_QUOTA_RESET_TIME = 604_800
    HOURLY_QUOTA_RESET_TIME = 600
    BASE_RESET_TIME = 60

    attr_reader :attr

    def initialize(http_header)
      fail "Rate Limit data should be a Hash but is #{http_header.inspect} (#{http_header.class.name})" unless http_header.is_a?(Hash)
      @attr = http_header
    end

    def limit_reached?
      @attr.key?('x-rejection-reason')
    end

    def rejection_reason
      return nil unless @attr['x-rejection-reason']
      case @attr['x-rejection-reason']
      when 'RegisteredQuotaPerWeek' then :weekly_quota
      when 'IndividualQuotaPerHour' then :hourly_quota
      else :unknown_reason
      end
    end

    def hourly_quota
      quota = @attr['x-individualquotaperhour-used']
      quota.to_i if quota
    end

    def weekly_quota
      quota = @attr['x-registeredquotaperweek-used']
      quota.to_i if quota
    end

    def reset_at
      return unless limit_reached?

      case rejection_reason
      when :weekly_quota then Time.now.to_i + WEEKLY_QUOTA_RESET_TIME
      when :hourly_quota then Time.now.to_i + HOURLY_QUOTA_RESET_TIME
      else Time.now.to_i + BASE_RESET_TIME
      end
    end
  end
end