@@ -6,45 +6,71 @@ module UrnLists
66 class ApiClient
77 class ApiError < StandardError ; end
88
9- def fetch_customers
10- token = fetch_access_token
11- fetch_urn_list ( token )
9+ TOP_COUNT = 1000
10+
11+ def fetch_rows
12+ fetch_paginated_rows (
13+ base_url : active_urns_url ,
14+ params : {
15+ 'api-version' => '2016-10-01' ,
16+ 'sp' => '/triggers/manual/run' ,
17+ 'sv' => '1.0' ,
18+ 'filter' => "Published eq 'True'"
19+ } ,
20+ error_message : 'Failed to fetch URN list'
21+ )
1222 end
1323
14- def fetch_inactive_customers
15- token = fetch_access_token
16- fetch_inactive_urn_list ( token )
24+ def fetch_inactive_rows
25+ fetch_paginated_rows (
26+ base_url : inactive_urns_url ,
27+ params : {
28+ 'api-version' => '2016-10-01' ,
29+ 'sp' => '/triggers/manual/run' ,
30+ 'sv' => '1.0'
31+ } ,
32+ error_message : 'Failed to fetch inactive URN list'
33+ )
1734 end
1835
1936 private
2037
21- def fetch_access_token
22- uri = URI . parse ( ENV . fetch ( 'MDM_API_TOKEN_URL' ) )
38+ def fetch_paginated_rows ( base_url : , params : , error_message : )
39+ token = fetch_access_token
2340
24- response = Net ::HTTP . post_form ( uri , {
25- grant_type : 'client_credentials' ,
26- client_id : ENV . fetch ( 'MDM_API_CLIENT_ID' ) ,
27- client_secret : ENV . fetch ( 'MDM_API_CLIENT_SECRET' ) ,
28- scope : ENV . fetch ( 'MDM_API_SCOPE' )
29- } )
41+ all_rows = [ ]
42+ skip = 0
3043
31- raise ApiError , "Failed to fetch access token: #{ response . code } " unless response . is_a? ( Net ::HTTPSuccess )
44+ loop do
45+ rows = fetch_page (
46+ token : token ,
47+ base_url : base_url ,
48+ params : params ,
49+ top_count : TOP_COUNT ,
50+ skip : skip ,
51+ error_message : error_message
52+ )
3253
33- body = JSON . parse ( response . body )
34- body . fetch ( 'access_token' )
35- end
54+ break if rows . empty?
3655
37- def fetch_urn_list ( token )
38- base_url = 'https://apim.crowncommercial.gov.uk/website-data/manual/paths/invoke/%5Batt%5D.%5Bvw_RMIActiveURNList%5D/'
39- params = {
40- 'api-version' => '2016-10-01' ,
41- 'sp' => '/triggers/manual/run' ,
42- 'sv' => '1.0' ,
43- 'filter' => "Published eq 'True'"
44- }
56+ all_rows . concat ( rows )
57+ break if rows . size < TOP_COUNT
4558
59+ skip += TOP_COUNT
60+ end
61+
62+ all_rows
63+ end
64+
65+ # rubocop:disable Metrics/ParameterLists
66+ def fetch_page ( token :, base_url :, params :, top_count :, skip :, error_message :)
4667 uri = URI ( base_url )
47- uri . query = URI . encode_www_form ( params )
68+ uri . query = URI . encode_www_form (
69+ params . merge (
70+ 'TopCount' => top_count ,
71+ 'SkipCount' => skip
72+ )
73+ )
4874
4975 request = Net ::HTTP ::Get . new ( uri . to_s )
5076 request [ 'Authorization' ] = "Bearer #{ token } "
@@ -54,43 +80,42 @@ def fetch_urn_list(token)
5480 http . request ( request )
5581 end
5682
57- raise ApiError , "Failed to fetch URN list : #{ response . code } " unless response . is_a? ( Net ::HTTPSuccess )
83+ raise ApiError , "#{ error_message } : #{ response . code } " unless response . is_a? ( Net ::HTTPSuccess )
5884
5985 rows = JSON . parse ( response . body )
6086 validate_rows! ( rows )
6187 rows
6288 end
89+ # rubocop:enable Metrics/ParameterLists
6390
64- def fetch_inactive_urn_list ( token )
65- base_url = 'https://apim.crowncommercial.gov.uk/website-data/manual/paths/invoke/%5Batt%5D.%5Bvw_RMIInactiveURNList%5D/'
66- params = {
67- 'api-version' => '2016-10-01' ,
68- 'sp' => '/triggers/manual/run' ,
69- 'sv' => '1.0'
70- }
71-
72- uri = URI ( base_url )
73- uri . query = URI . encode_www_form ( params )
74-
75- request = Net ::HTTP ::Get . new ( uri . to_s )
76- request [ 'Authorization' ] = "Bearer #{ token } "
77- request [ 'Accept' ] = 'application/json'
91+ def fetch_access_token
92+ uri = URI . parse ( ENV . fetch ( 'MDM_API_TOKEN_URL' ) )
7893
79- response = Net ::HTTP . start ( uri . hostname , uri . port , use_ssl : uri . scheme == 'https' ) do |http |
80- http . request ( request )
81- end
94+ response = Net ::HTTP . post_form ( uri , {
95+ grant_type : 'client_credentials' ,
96+ client_id : ENV . fetch ( 'MDM_API_CLIENT_ID' ) ,
97+ client_secret : ENV . fetch ( 'MDM_API_CLIENT_SECRET' ) ,
98+ scope : ENV . fetch ( 'MDM_API_SCOPE' )
99+ } )
82100
83- raise ApiError , "Failed to fetch inactive URN list : #{ response . code } " unless response . is_a? ( Net ::HTTPSuccess )
101+ raise ApiError , "Failed to fetch access token : #{ response . code } " unless response . is_a? ( Net ::HTTPSuccess )
84102
85- rows = JSON . parse ( response . body )
86- validate_rows! ( rows )
87- rows
103+ body = JSON . parse ( response . body )
104+ body . fetch ( 'access_token' )
88105 end
89106
90107 def validate_rows! ( rows )
91108 return if rows . is_a? ( Array ) && rows . all? { |row | row . is_a? ( Hash ) }
92109
93110 raise ApiError , 'Invalid URN list format: expected an array of objects'
94111 end
112+
113+ def active_urns_url
114+ 'https://apim.crowncommercial.gov.uk/website-data/manual/paths/invoke/%5Batt%5D.%5Bvw_RMIActiveURNList%5D/'
115+ end
116+
117+ def inactive_urns_url
118+ 'https://apim.crowncommercial.gov.uk/website-data/manual/paths/invoke/%5Batt%5D.%5Bvw_RMIInactiveURNList%5D/'
119+ end
95120 end
96121end
0 commit comments