CardTapp/yext-api

View on GitHub
lib/yext/api/utils/middleware/api_rate_limits.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module Yext
  module Api
    module Utils
      module Middleware
        # Faraday Middleware for extracting API limits from call responses.
        class ApiRateLimits < Faraday::Response::Middleware
          def call(env)
            @app.call(env).on_complete do |environment|
              save_rates(environment, Yext::Api::Utils::ApiFinder.new(env[:url], env[:method]).find_api)

              env.response
            end
          end

          private

          def save_rates(environment, api_module)
            return if api_module.blank?

            response_headers = environment[:response_headers]

            return unless response_headers.key?("rate-limit-remaining")

            api_module.send(:update_rates,
                            remaining: response_headers["rate-limit-remaining"].to_i,
                            limit:     response_headers["rate-limit-limit"].to_i,
                            reset_at:  Time.at(response_headers["rate-limit-reset"].to_i))
          end
        end
      end
    end
  end
end