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)