limits.rb 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. module ShopifyAPI
  2. module Limits
  3. class LimitUnavailable < StandardError; end
  4. def self.included(klass)
  5. klass.send(:extend, ClassMethods)
  6. end
  7. module ClassMethods
  8. # Takes form num_requests_executed/max_requests
  9. # Eg: 101/3000
  10. CREDIT_LIMIT_HEADER_PARAM = {
  11. :shop => 'http_x_shopify_shop_api_call_limit'
  12. }
  13. ##
  14. # How many more API calls can I make?
  15. # @return {Integer}
  16. #
  17. def credit_left
  18. credit_limit(:shop) - credit_used(:shop)
  19. end
  20. alias_method :available_calls, :credit_left
  21. ##
  22. # Have I reached my API call limit?
  23. # @return {Boolean}
  24. #
  25. def credit_maxed?
  26. credit_left <= 0
  27. end
  28. alias_method :maxed?, :credit_maxed?
  29. ##
  30. # How many total API calls can I make?
  31. # NOTE: subtracting 1 from credit_limit because I think ShopifyAPI cuts off at 299 or shop limits.
  32. # @param {Symbol} scope [:shop]
  33. # @return {Integer}
  34. #
  35. def credit_limit(scope=:shop)
  36. @api_credit_limit ||= {}
  37. @api_credit_limit[scope] ||= api_credit_limit_param(scope).pop.to_i - 1
  38. end
  39. alias_method :call_limit, :credit_limit
  40. ##
  41. # How many API calls have I made?
  42. # @param {Symbol} scope [:shop]
  43. # @return {Integer}
  44. #
  45. def credit_used(scope=:shop)
  46. api_credit_limit_param(scope).shift.to_i
  47. end
  48. alias_method :call_count, :credit_used
  49. ##
  50. # @return {HTTPResonse}
  51. #
  52. def response
  53. Shop.current unless ShopifyAPI::Base.connection.response
  54. ShopifyAPI::Base.connection.response
  55. end
  56. private
  57. ##
  58. # @return {Array}
  59. #
  60. def api_credit_limit_param(scope)
  61. header = response[CREDIT_LIMIT_HEADER_PARAM[scope]]
  62. raise LimitUnavailable unless header
  63. header.split('/')
  64. end
  65. end
  66. end
  67. end