pagination_link_headers.rb 928 B

123456789101112131415161718192021222324252627282930313233
  1. module ShopifyAPI
  2. class InvalidPaginationLinksError < StandardError; end
  3. class PaginationLinkHeaders
  4. LinkHeader = Struct.new(:url, :rel)
  5. attr_reader :previous_link, :next_link
  6. def initialize(link_header)
  7. links = parse_link_header(link_header)
  8. @previous_link = links.find { |link| link.rel == :previous }
  9. @next_link = links.find { |link| link.rel == :next }
  10. end
  11. private
  12. def parse_link_header(link_header)
  13. return [] unless link_header.present?
  14. links = link_header.split(',')
  15. links.map do |link|
  16. parts = link.split('; ')
  17. unless parts.length == 2
  18. raise ShopifyAPI::InvalidPaginationLinksError, "Invalid link header: url and rel expected"
  19. end
  20. url = parts[0][/<(.*)>/, 1]
  21. rel = parts[1][/rel="(.*)"/, 1]&.to_sym
  22. url = URI.parse(url).request_uri
  23. LinkHeader.new(url, rel)
  24. end
  25. end
  26. end
  27. end