lib/wcc/contentful/simple_client/response.rb in wcc-contentful-0.2.2 vs lib/wcc/contentful/simple_client/response.rb in wcc-contentful-0.3.0.pre.rc

- old
+ new

@@ -20,46 +20,51 @@ def error_message raw.dig('message') || "#{code}: #{raw_response.message}" end + def next_page? + return unless raw.key? 'items' + + raw['items'].length + raw['skip'] < raw['total'] + end + + def next_page + return unless next_page? + + @next_page ||= @client.get( + @request[:url], + (@request[:query] || {}).merge({ + skip: raw['items'].length + raw['skip'] + }) + ) + @next_page.assert_ok! + end + def initialize(client, request, raw_response) @client = client @request = request @raw_response = raw_response @body = raw_response.body.to_s end def assert_ok! return self if code >= 200 && code < 300 + raise ApiError[code], self end def each_page(&block) raise ArgumentError, 'Not a collection response' unless raw['items'] - memoized_pages = (@memoized_pages ||= [self]) ret = Enumerator.new do |y| - page_index = 0 - current_page = self - loop do - y << current_page + y << self - skip_amt = current_page.raw['items'].length + current_page.raw['skip'] - break if current_page.raw['items'].empty? || skip_amt >= current_page.raw['total'] - - page_index += 1 - if page_index < memoized_pages.length - current_page = memoized_pages[page_index] - else - current_page = @client.get( - @request[:url], - (@request[:query] || {}).merge({ skip: skip_amt }) - ) - current_page.assert_ok! - memoized_pages.push(current_page) + if next_page? + next_page.each_page.each do |page| + y << page end end end if block_given? @@ -79,44 +84,62 @@ raw['total'] end def first raise ArgumentError, 'Not a collection response' unless raw['items'] + raw['items'].first end + + def includes + @includes ||= + raw.dig('includes')&.each_with_object({}) do |(_t, entries), h| + entries.each { |e| h[e.dig('sys', 'id')] = e } + end || {} + + return @includes unless @next_page + + # This could be more efficient - maybe not worth worrying about + @includes.merge(@next_page.includes) + end end class SyncResponse < Response def initialize(response) super(response.client, response.request, response.raw_response) end + def next_page? + raw['nextPageUrl'].present? + end + + def next_page + return unless next_page? + + @next_page ||= SyncResponse.new(@client.get(raw['nextPageUrl'])) + @next_page.assert_ok! + end + def next_sync_token - @next_sync_token ||= SyncResponse.parse_sync_token(raw['nextSyncUrl']) + # If we haven't grabbed the next page yet, then our next "sync" will be getting + # the next page. We could just as easily call sync again with that token. + @next_page&.next_sync_token || + @next_sync_token ||= SyncResponse.parse_sync_token( + raw['nextPageUrl'] || raw['nextSyncUrl'] + ) end def each_page raise ArgumentError, 'Not a collection response' unless raw['items'] - memoized_pages = (@memoized_pages ||= [self]) ret = Enumerator.new do |y| - page_index = 0 - current_page = self - loop do - y << current_page + y << self - break if current_page.raw['items'].empty? - - page_index += 1 - if page_index < memoized_pages.length - current_page = memoized_pages[page_index] - else - current_page = @client.get(raw['nextSyncUrl']) - current_page.assert_ok! - @next_sync_token = SyncResponse.parse_sync_token(current_page.raw['nextSyncUrl']) - memoized_pages.push(current_page) + if next_page? + next_page.each_page.each do |page| + y << page end end end if block_given? @@ -125,10 +148,11 @@ ret.lazy end end def count - raw['items'].length + raise NotImplementedError, + 'Sync does not return an accurate total. Use #items.count instead.' end def self.parse_sync_token(url) url = URI.parse(url) q = CGI.parse(url.query)