1- module EndlessPages
2- extend ActiveSupport ::Concern
1+ module Adcloud
2+ module EndlessPages
3+ extend ActiveSupport ::Concern
34
4- module ClassMethods
5+ module ClassMethods
56
6- def endless_pages ( opts = { } , &block )
7- @opts = opts
8- perform ( &block )
9- end
7+ def endless_pages ( opts = { } , &block )
8+ @opts = opts
9+ perform ( &block )
10+ end
1011
11- def conn
12- @opts [ :connection ] ||= Adcloud ::Connection . new
13- end
12+ def conn
13+ @opts [ :connection ] ||= Adcloud ::Connection . new
14+ end
1415
15- def endpoint
16- @opts [ :endpoint_url ] ||= self . endpoint_url
17- raise "You must either pass endpoint_url into endless_pages OR define a class method .endpoint_url" unless @opts [ :endpoint_url ]
18- @opts [ :endpoint_url ]
19- end
16+ def endpoint
17+ @opts [ :endpoint_url ] ||= self . endpoint_url
18+ raise "You must either pass endpoint_url into endless_pages OR define a class method .endpoint_url" unless @opts [ :endpoint_url ]
19+ @opts [ :endpoint_url ]
20+ end
2021
21- def params
22- @opts [ :params ] ||= { }
23- end
22+ def params
23+ @opts [ :params ] ||= { }
24+ end
2425
25- def perform ( &block )
26- paged_items = [ ]
26+ def perform ( &block )
27+ paged_items = [ ]
2728
28- page = params [ :page ] ||= 1
29- page = 1 if page == 0
29+ page = params [ :page ] ||= 1
30+ page = 1 if page == 0
3031
31- total_pages = 1
32- retry_count = 0
33- page_result = params [ :page_result ] ||= [ ]
32+ total_pages = 1
33+ retry_count = 0
34+ page_result = params [ :page_result ] ||= [ ]
3435
35- begin
36- Adcloud ::logger . debug "Page: #{ page } "
36+ begin
37+ Adcloud ::logger . debug "Page: #{ page } "
3738
38- params [ :page ] = page
39+ params [ :page ] = page
3940
40- raw_result = conn . get ( endpoint , params )
41- total_pages = raw_result [ '_meta' ] [ 'total_pages' ]
42- Adcloud ::logger . debug "total_pages: #{ total_pages } "
43- page_result = self . new ( raw_result ) # your service class needs to include Virtus
44- # if a block is provided then start returning results right away
45- page_result . items . each do |item |
46- block . call ( item )
47- end if block
41+ raw_result = conn . get ( endpoint , params )
42+ total_pages = raw_result [ '_meta' ] [ 'total_pages' ] || 0
43+ Adcloud ::logger . debug "total_pages: #{ total_pages } "
44+ page_result = self . new ( raw_result ) # your service class needs to include Virtus
45+ # if a block is provided then start returning results right away
46+ page_result . items . each do |item |
47+ block . call ( item )
48+ end if block
4849
49- paged_items += page_result . items
50- page += 1
51- rescue => ex
52- if retry_count <= 5
53- retry
54- else
55- Adcloud . logger . error { "API Exception #{ ex } " }
56- raise ApiError , "Connection failed"
57- end
58- retry_count += 1
59- end while page <= total_pages
60- Adcloud ::logger . debug "Items: #{ paged_items . length } "
61- paged_items
62- end
50+ paged_items += page_result . items
51+ page += 1
52+ rescue => ex
53+ Adcloud . logger . debug "Retry count: #{ retry_count } "
54+ if retry_count == 5
55+ retry_count += 1
56+ retry
57+ else
58+ Adcloud . logger . error { "API Exception #{ ex } " }
59+ raise StandardError , "Connection failed"
60+ end
61+ end while page <= total_pages
62+ Adcloud ::logger . debug "Items: #{ paged_items . length } "
63+ paged_items
64+ end
6365
66+ end
6467 end
65- end
68+ end
0 commit comments