gds-api-adapters 70.0.0 → 71.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 632391e17f65b54797ea177945c0993fc71545d61a10975b244cf45355723ca1
4
- data.tar.gz: dc7b387e7d2038c54541d4dd5382a75d316bbe383870326e89c6c31e8fdbb229
3
+ metadata.gz: d1bcd6f2192952444f80e49762cc4d1e2820c767162d194de9ce6c0f1b78ad2c
4
+ data.tar.gz: cc96d6dc6f18b3ec2a58187977147b8be0bf6025e7a47c4b55671f2ab900c78f
5
5
  SHA512:
6
- metadata.gz: e1a99f505078d1b27dba69a7b53b1945fdc83c2eb25fb0a6627090d6b77b67b43f324f8ff1ae76c447608e0265749083b78f74d28ec5c7703be4600aebf15174
7
- data.tar.gz: a02640e69fb8a4d0292bdd97dee1061c5c498c5412812d74b40733bd7e10a06077631b93f74e8687b763362e1b4776221e60e201d287cbccf3b6d6d1868795c4
6
+ metadata.gz: 2b0911632959b5c61c22ca3c5f208bd69d8cd6db5984fe83c4912251d38f1e895f8a90eda372de721a9f85a59af4931517eb468c3a23d554d9d3a9e4ecd24734
7
+ data.tar.gz: 1ed0f2a61ed3833a05283684a443ae148324ae22e92daa49e14982af4e908ea5e4f96cda2f74ad20bedae96fdad3d4641fee09c01b958fd63e53190e319b7357
@@ -12,10 +12,17 @@ class GdsApi::AccountApi < GdsApi::Base
12
12
  #
13
13
  # @param [String, nil] redirect_path path on GOV.UK to send the user to after authentication
14
14
  # @param [String, nil] state_id identifier originally returned by #create_registration_state
15
+ # @param [String, nil] level_of_authentication either "level1" (require MFA) or "level0" (do not require MFA)
15
16
  #
16
17
  # @return [Hash] An authentication URL and the OAuth state parameter (for CSRF protection)
17
- def get_sign_in_url(redirect_path: nil, state_id: nil)
18
- querystring = nested_query_string({ redirect_path: redirect_path, state_id: state_id }.compact)
18
+ def get_sign_in_url(redirect_path: nil, state_id: nil, level_of_authentication: nil)
19
+ querystring = nested_query_string(
20
+ {
21
+ redirect_path: redirect_path,
22
+ state_id: state_id,
23
+ level_of_authentication: level_of_authentication,
24
+ }.compact,
25
+ )
19
26
  get_json("#{endpoint}/api/oauth2/sign-in?#{querystring}")
20
27
  end
21
28
 
@@ -38,6 +45,26 @@ class GdsApi::AccountApi < GdsApi::Base
38
45
  post_json("#{endpoint}/api/oauth2/state", attributes: attributes)
39
46
  end
40
47
 
48
+ # Get all the information about a user needed to render the account home page
49
+ #
50
+ # @param [String] govuk_account_session Value of the session header
51
+ #
52
+ # @return [Hash] Information about the user and the services they've used, and a new session header
53
+ def get_user(govuk_account_session:)
54
+ get_json("#{endpoint}/api/user", auth_headers(govuk_account_session))
55
+ end
56
+
57
+ # Update the user record with privileged information from the auth service. Only the auth service will call this.
58
+ #
59
+ # @param [String] subject_identifier The identifier of the user, shared between the auth service and GOV.UK.
60
+ # @param [String, nil] email The new email address
61
+ # @param [Boolean, nil] email_verified Whether the new email address is verified
62
+ #
63
+ # @return [Hash] The user's subject identifier and email attributes
64
+ def update_user_by_subject_identifier(subject_identifier:, email: nil, email_verified: nil)
65
+ patch_json("#{endpoint}/api/oidc-users/#{subject_identifier}", { email: email, email_verified: email_verified }.compact)
66
+ end
67
+
41
68
  # Check if a user has an email subscription for the Transition Checker
42
69
  #
43
70
  # @param [String] govuk_account_session Value of the session header
@@ -75,7 +102,58 @@ class GdsApi::AccountApi < GdsApi::Base
75
102
  #
76
103
  # @return [Hash] A new session header
77
104
  def set_attributes(attributes:, govuk_account_session:)
78
- patch_json("#{endpoint}/api/attributes", { attributes: attributes.transform_values(&:to_json) }, auth_headers(govuk_account_session))
105
+ patch_json("#{endpoint}/api/attributes", { attributes: attributes }, auth_headers(govuk_account_session))
106
+ end
107
+
108
+ # Look up the names of a user's attributes
109
+ #
110
+ # @param [String] attributes Names of the attributes to check
111
+ # @param [String] govuk_account_session Value of the session header
112
+ #
113
+ # @return [Hash] The attribute names (if present), and a new session header
114
+ def get_attributes_names(attributes:, govuk_account_session:)
115
+ querystring = nested_query_string({ attributes: attributes }.compact)
116
+ get_json("#{endpoint}/api/attributes/names?#{querystring}", auth_headers(govuk_account_session))
117
+ end
118
+
119
+ # Look up all pages saved by a user in their Account
120
+ #
121
+ # @param [String] govuk_account_session Value of the session header
122
+ #
123
+ # @return [Hash] containing :saved_pages, an array of single saved page hashes def get_saved_pages(govuk_account_session:)
124
+ def get_saved_pages(govuk_account_session:)
125
+ get_json("#{endpoint}/api/saved-pages", auth_headers(govuk_account_session))
126
+ end
127
+
128
+ # Return a single page by unique URL
129
+ #
130
+ # @param [String] the path of a page to check
131
+ # @param [String] govuk_account_session Value of the session header
132
+ #
133
+ # @return [Hash] containing :saved_page, a hash of a single saved page value
134
+ def get_saved_page(page_path:, govuk_account_session:)
135
+ get_json("#{endpoint}/api/saved-pages/#{CGI.escape(page_path)}", auth_headers(govuk_account_session))
136
+ end
137
+
138
+ # Upsert a single saved page entry in a users account
139
+ #
140
+ # @param [String] the path of a page to check
141
+ # @param [String] govuk_account_session Value of the session header
142
+ #
143
+ # @return [Hash] A single saved page value (if sucessful)
144
+ def save_page(page_path:, govuk_account_session:)
145
+ put_json("#{endpoint}/api/saved-pages/#{CGI.escape(page_path)}", {}, auth_headers(govuk_account_session))
146
+ end
147
+
148
+ # Delete a single saved page entry from a users account
149
+ #
150
+ # @param [String] the path of a page to check
151
+ # @param [String] govuk_account_session Value of the session header
152
+ #
153
+ # @return [GdsApi::Response] A status code of 204 indicates the saved page has been successfully deleted.
154
+ # A status code of 404 indicates there is no saved page with this path.
155
+ def delete_saved_page(page_path:, govuk_account_session:)
156
+ delete_json("#{endpoint}/api/saved-pages/#{CGI.escape(page_path)}", {}, auth_headers(govuk_account_session))
79
157
  end
80
158
 
81
159
  private
@@ -23,12 +23,13 @@ module GdsApi
23
23
 
24
24
  # Superclass for all 4XX and 5XX errors
25
25
  class HTTPErrorResponse < BaseError
26
- attr_accessor :code, :error_details
26
+ attr_accessor :code, :error_details, :http_body
27
27
 
28
- def initialize(code, message = nil, error_details = nil)
28
+ def initialize(code, message = nil, error_details = nil, http_body = nil)
29
29
  super(message)
30
30
  @code = code
31
31
  @error_details = error_details
32
+ @http_body = http_body
32
33
  end
33
34
  end
34
35
 
@@ -72,7 +73,7 @@ module GdsApi
72
73
  def build_specific_http_error(error, url, details = nil)
73
74
  message = "URL: #{url}\nResponse body:\n#{error.http_body}"
74
75
  code = error.http_code
75
- error_class_for_code(code).new(code, message, details)
76
+ error_class_for_code(code).new(code, message, details, error.http_body)
76
77
  end
77
78
 
78
79
  def error_class_for_code(code)
@@ -180,10 +180,10 @@ module GdsApi
180
180
  raise GdsApi::EndpointNotFound, "Could not connect to #{url}"
181
181
  rescue RestClient::Exceptions::Timeout => e
182
182
  logger.error loggable.merge(status: "timeout", error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
183
- raise GdsApi::TimedOutException
183
+ raise GdsApi::TimedOutException, e.message
184
184
  rescue URI::InvalidURIError => e
185
185
  logger.error loggable.merge(status: "invalid_uri", error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
186
- raise GdsApi::InvalidUrl
186
+ raise GdsApi::InvalidUrl, e.message
187
187
  rescue RestClient::Exception => e
188
188
  # Log the error here, since we have access to loggable, but raise the
189
189
  # exception up to the calling method to deal with
@@ -192,10 +192,10 @@ module GdsApi
192
192
  raise
193
193
  rescue Errno::ECONNRESET => e
194
194
  logger.error loggable.merge(status: "connection_reset", error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
195
- raise GdsApi::TimedOutException
195
+ raise GdsApi::TimedOutException, e.message
196
196
  rescue SocketError => e
197
197
  logger.error loggable.merge(status: "socket_error", error_message: e.message, error_class: e.class.name, end_time: Time.now.to_f).to_json
198
- raise GdsApi::SocketErrorException
198
+ raise GdsApi::SocketErrorException, e.message
199
199
  end
200
200
  end
201
201
  end
@@ -89,37 +89,6 @@ class GdsApi::LinkCheckerApi < GdsApi::Base
89
89
  )
90
90
  end
91
91
 
92
- # Update or create a set of links to be monitored for a resource.
93
- #
94
- # Makes a +POST+ request to the link checker api to create a resource monitor.
95
- #
96
- # @param links [Array] A list of URIs to monitor.
97
- # @param reference [String] A unique id for the resource being monitored
98
- # @param app [String] The name of the service the call originated e.g. 'whitehall'
99
- # @return [MonitorReport] A +SimpleDelegator+ of the +GdsApi::Response+ which
100
- # responds to:
101
- # :id the ID of the created resource monitor
102
- #
103
- # @raise [HTTPErrorResponse] if the request returns an error
104
-
105
- def upsert_resource_monitor(links, app, reference)
106
- payload = {
107
- links: links,
108
- app: app,
109
- reference: reference,
110
- }
111
-
112
- response = post_json("#{endpoint}/monitor", payload)
113
-
114
- MonitorReport.new(response.to_hash)
115
- end
116
-
117
- class MonitorReport < SimpleDelegator
118
- def id
119
- self["id"]
120
- end
121
- end
122
-
123
92
  class LinkReport < SimpleDelegator
124
93
  def uri
125
94
  self["uri"]
@@ -5,8 +5,8 @@ module GdsApi
5
5
  module AccountApi
6
6
  ACCOUNT_API_ENDPOINT = Plek.find("account-api")
7
7
 
8
- def stub_account_api_get_sign_in_url(redirect_path: nil, state_id: nil, auth_uri: "http://auth/provider", state: "state")
9
- querystring = Rack::Utils.build_nested_query({ redirect_path: redirect_path, state_id: state_id }.compact)
8
+ def stub_account_api_get_sign_in_url(redirect_path: nil, state_id: nil, level_of_authentication: nil, auth_uri: "http://auth/provider", state: "state")
9
+ querystring = Rack::Utils.build_nested_query({ redirect_path: redirect_path, state_id: state_id, level_of_authentication: level_of_authentication }.compact)
10
10
  stub_request(:get, "#{ACCOUNT_API_ENDPOINT}/api/oauth2/sign-in?#{querystring}")
11
11
  .to_return(
12
12
  status: 200,
@@ -38,63 +38,356 @@ module GdsApi
38
38
  )
39
39
  end
40
40
 
41
- def stub_account_api_has_email_subscription(govuk_account_session: nil, new_govuk_account_session: nil)
42
- if govuk_account_session
43
- stub_request(:get, "#{ACCOUNT_API_ENDPOINT}/api/transition-checker-email-subscription")
44
- .with(headers: { GdsApi::AccountApi::AUTH_HEADER_NAME => govuk_account_session })
45
- .to_return(status: 200, body: { govuk_account_session: new_govuk_account_session, has_subscription: true }.compact.to_json)
46
- else
47
- stub_request(:get, "#{ACCOUNT_API_ENDPOINT}/api/transition-checker-email-subscription")
48
- .to_return(status: 200, body: { govuk_account_session: new_govuk_account_session, has_subscription: true }.compact.to_json)
49
- end
41
+ def stub_account_api_user_info(level_of_authentication: "level0", email: "email@example.com", email_verified: true, services: {}, **options)
42
+ stub_account_api_request(
43
+ :get,
44
+ "/api/user",
45
+ response_body: {
46
+ level_of_authentication: level_of_authentication,
47
+ email: email,
48
+ email_verified: email_verified,
49
+ services: services,
50
+ },
51
+ **options,
52
+ )
50
53
  end
51
54
 
52
- def stub_account_api_does_not_have_email_subscription(govuk_account_session: nil, new_govuk_account_session: nil)
53
- if govuk_account_session
54
- stub_request(:get, "#{ACCOUNT_API_ENDPOINT}/api/transition-checker-email-subscription")
55
- .with(headers: { GdsApi::AccountApi::AUTH_HEADER_NAME => govuk_account_session })
56
- .to_return(status: 200, body: { govuk_account_session: new_govuk_account_session, has_subscription: false }.compact.to_json)
57
- else
58
- stub_request(:get, "#{ACCOUNT_API_ENDPOINT}/api/transition-checker-email-subscription")
59
- .to_return(status: 200, body: { govuk_account_session: new_govuk_account_session, has_subscription: false }.compact.to_json)
60
- end
55
+ def stub_account_api_user_info_service_state(service:, service_state: "yes", **options)
56
+ stub_account_api_user_info(
57
+ **options.merge(
58
+ services: options.fetch(:services, {}).merge(service => service_state),
59
+ ),
60
+ )
61
61
  end
62
62
 
63
- def stub_account_api_set_email_subscription(govuk_account_session: nil, slug: "slug", new_govuk_account_session: nil)
64
- if govuk_account_session
65
- stub_request(:post, "#{ACCOUNT_API_ENDPOINT}/api/transition-checker-email-subscription")
66
- .with(body: hash_including({ slug: slug }.compact), headers: { GdsApi::AccountApi::AUTH_HEADER_NAME => govuk_account_session })
67
- .to_return(status: 200, body: { govuk_account_session: new_govuk_account_session }.compact.to_json)
68
- else
69
- stub_request(:post, "#{ACCOUNT_API_ENDPOINT}/api/transition-checker-email-subscription")
70
- .with(body: hash_including({ slug: slug }.compact))
71
- .to_return(status: 200, body: { govuk_account_session: new_govuk_account_session }.compact.to_json)
72
- end
63
+ def stub_account_api_unauthorized_user_info(**options)
64
+ stub_account_api_request(
65
+ :get,
66
+ "/api/user",
67
+ response_status: 401,
68
+ **options,
69
+ )
70
+ end
71
+
72
+ def stub_update_user_by_subject_identifier(subject_identifier:, email: nil, email_verified: nil, old_email: nil, old_email_verified: nil)
73
+ stub_account_api_request(
74
+ :patch,
75
+ "/api/oidc-users/#{subject_identifier}",
76
+ with: { body: hash_including({ email: email, email_verified: email_verified }.compact) },
77
+ response_body: {
78
+ sub: subject_identifier,
79
+ email: email || old_email,
80
+ email_verified: email_verified || old_email_verified,
81
+ },
82
+ )
83
+ end
84
+
85
+ def stub_account_api_has_email_subscription(**options)
86
+ stub_account_api_request(
87
+ :get,
88
+ "/api/transition-checker-email-subscription",
89
+ response_body: { has_subscription: true },
90
+ **options,
91
+ )
92
+ end
93
+
94
+ def stub_account_api_does_not_have_email_subscription(**options)
95
+ stub_account_api_request(
96
+ :get,
97
+ "/api/transition-checker-email-subscription",
98
+ response_body: { has_subscription: false },
99
+ **options,
100
+ )
101
+ end
102
+
103
+ def stub_account_api_unauthorized_get_email_subscription(**options)
104
+ stub_account_api_request(
105
+ :get,
106
+ "/api/transition-checker-email-subscription",
107
+ response_status: 401,
108
+ **options,
109
+ )
110
+ end
111
+
112
+ def stub_account_api_forbidden_get_email_subscription(needed_level_of_authentication: "level1", **options)
113
+ stub_account_api_request(
114
+ :get,
115
+ "/api/transition-checker-email-subscription",
116
+ response_status: 403,
117
+ response_body: { needed_level_of_authentication: needed_level_of_authentication },
118
+ **options,
119
+ )
120
+ end
121
+
122
+ def stub_account_api_set_email_subscription(slug: nil, **options)
123
+ stub_account_api_request(
124
+ :post,
125
+ "/api/transition-checker-email-subscription",
126
+ with: { body: hash_including({ slug: slug }.compact) },
127
+ **options,
128
+ )
73
129
  end
74
130
 
75
- def stub_account_api_has_attributes(govuk_account_session: nil, attributes: [], values: {}, new_govuk_account_session: nil)
131
+ def stub_account_api_unauthorized_set_email_subscription(slug: nil, **options)
132
+ stub_account_api_request(
133
+ :post,
134
+ "/api/transition-checker-email-subscription",
135
+ with: { body: hash_including({ slug: slug }.compact) },
136
+ response_status: 401,
137
+ **options,
138
+ )
139
+ end
140
+
141
+ def stub_account_api_forbidden_set_email_subscription(slug: nil, needed_level_of_authentication: "level1", **options)
142
+ stub_account_api_request(
143
+ :post,
144
+ "/api/transition-checker-email-subscription",
145
+ with: { body: hash_including({ slug: slug }.compact) },
146
+ response_status: 403,
147
+ response_body: { needed_level_of_authentication: needed_level_of_authentication },
148
+ **options,
149
+ )
150
+ end
151
+
152
+ def stub_account_api_has_attributes(attributes: [], values: {}, **options)
76
153
  querystring = Rack::Utils.build_nested_query({ attributes: attributes }.compact)
77
- if govuk_account_session
78
- stub_request(:get, "#{ACCOUNT_API_ENDPOINT}/api/attributes?#{querystring}")
79
- .with(headers: { GdsApi::AccountApi::AUTH_HEADER_NAME => govuk_account_session })
80
- .to_return(status: 200, body: { govuk_account_session: new_govuk_account_session, values: values }.compact.to_json)
81
- else
82
- stub_request(:get, "#{ACCOUNT_API_ENDPOINT}/api/attributes?#{querystring}")
83
- .to_return(status: 200, body: { govuk_account_session: new_govuk_account_session, values: values }.compact.to_json)
84
- end
154
+ stub_account_api_request(
155
+ :get,
156
+ "/api/attributes?#{querystring}",
157
+ response_body: { values: values },
158
+ **options,
159
+ )
160
+ end
161
+
162
+ def stub_account_api_unauthorized_has_attributes(attributes: [], **options)
163
+ querystring = Rack::Utils.build_nested_query({ attributes: attributes }.compact)
164
+ stub_account_api_request(
165
+ :get,
166
+ "/api/attributes?#{querystring}",
167
+ response_status: 401,
168
+ **options,
169
+ )
170
+ end
171
+
172
+ def stub_account_api_forbidden_has_attributes(attributes: [], needed_level_of_authentication: "level1", **options)
173
+ querystring = Rack::Utils.build_nested_query({ attributes: attributes }.compact)
174
+ stub_account_api_request(
175
+ :get,
176
+ "/api/attributes?#{querystring}",
177
+ response_status: 403,
178
+ response_body: { needed_level_of_authentication: needed_level_of_authentication },
179
+ **options,
180
+ )
181
+ end
182
+
183
+ def stub_account_api_set_attributes(attributes: nil, **options)
184
+ stub_account_api_request(
185
+ :patch,
186
+ "/api/attributes",
187
+ with: { body: hash_including({ attributes: attributes }.compact) },
188
+ **options,
189
+ )
190
+ end
191
+
192
+ def stub_account_api_unauthorized_set_attributes(attributes: nil, **options)
193
+ stub_account_api_request(
194
+ :patch,
195
+ "/api/attributes",
196
+ with: { body: hash_including({ attributes: attributes }.compact) },
197
+ response_status: 401,
198
+ **options,
199
+ )
200
+ end
201
+
202
+ def stub_account_api_forbidden_set_attributes(attributes: nil, needed_level_of_authentication: "level1", **options)
203
+ stub_account_api_request(
204
+ :patch,
205
+ "/api/attributes",
206
+ with: { body: hash_including({ attributes: attributes }.compact) },
207
+ response_status: 403,
208
+ response_body: { needed_level_of_authentication: needed_level_of_authentication },
209
+ **options,
210
+ )
85
211
  end
86
212
 
87
- def stub_account_api_set_attributes(govuk_account_session: nil, attributes: nil, new_govuk_account_session: nil)
88
- if govuk_account_session
89
- stub_request(:patch, "#{ACCOUNT_API_ENDPOINT}/api/attributes")
90
- .with(body: hash_including({ attributes: attributes&.transform_values(&:to_json) }.compact), headers: { GdsApi::AccountApi::AUTH_HEADER_NAME => govuk_account_session })
91
- .to_return(status: 200, body: { govuk_account_session: new_govuk_account_session }.compact.to_json)
213
+ def stub_account_api_get_attributes_names(attributes: [], **options)
214
+ querystring = Rack::Utils.build_nested_query({ attributes: attributes }.compact)
215
+ stub_account_api_request(
216
+ :get,
217
+ "/api/attributes/names?#{querystring}",
218
+ response_body: { values: attributes },
219
+ **options,
220
+ )
221
+ end
222
+
223
+ def stub_account_api_unauthorized_get_attributes_names(attributes: [], **options)
224
+ querystring = Rack::Utils.build_nested_query({ attributes: attributes }.compact)
225
+ stub_account_api_request(
226
+ :get,
227
+ "/api/attributes/names?#{querystring}",
228
+ response_status: 401,
229
+ **options,
230
+ )
231
+ end
232
+
233
+ def stub_account_api_forbidden_get_attributes_names(attributes: [], needed_level_of_authentication: "level1", **options)
234
+ querystring = Rack::Utils.build_nested_query({ attributes: attributes }.compact)
235
+ stub_account_api_request(
236
+ :get,
237
+ "/api/attributes/names?#{querystring}",
238
+ response_status: 403,
239
+ response_body: { needed_level_of_authentication: needed_level_of_authentication },
240
+ **options,
241
+ )
242
+ end
243
+
244
+ def stub_account_api_request(method, path, with: {}, response_status: 200, response_body: {}, govuk_account_session: nil, new_govuk_account_session: nil)
245
+ with.merge!(headers: { GdsApi::AccountApi::AUTH_HEADER_NAME => govuk_account_session }) if govuk_account_session
246
+ new_govuk_account_session = nil if response_status >= 400
247
+ to_return = { status: response_status, body: response_body.merge(govuk_account_session: new_govuk_account_session).compact.to_json }
248
+ if with.empty?
249
+ stub_request(method, "#{ACCOUNT_API_ENDPOINT}#{path}").to_return(**to_return)
92
250
  else
93
- stub_request(:patch, "#{ACCOUNT_API_ENDPOINT}/api/attributes")
94
- .with(body: hash_including({ attributes: attributes&.transform_values(&:to_json) }.compact))
95
- .to_return(status: 200, body: { govuk_account_session: new_govuk_account_session }.compact.to_json)
251
+ stub_request(method, "#{ACCOUNT_API_ENDPOINT}#{path}").with(**with).to_return(**to_return)
96
252
  end
97
253
  end
254
+
255
+ ######################
256
+ # GET /api/saved-pages
257
+ ######################
258
+ def stub_account_api_returning_saved_pages(saved_pages: [], **options)
259
+ stub_account_api_request(
260
+ :get,
261
+ "/api/saved-pages",
262
+ response_body: { saved_pages: saved_pages },
263
+ **options,
264
+ )
265
+ end
266
+
267
+ def stub_account_api_unauthorized_get_saved_pages(**options)
268
+ stub_account_api_request(
269
+ :get,
270
+ "/api/saved-pages",
271
+ response_status: 401,
272
+ **options,
273
+ )
274
+ end
275
+
276
+ #################################
277
+ # GET /api/saved_pages/:page_path
278
+ #################################
279
+ def stub_account_api_get_saved_page(page_path:, content_id: "46163ed2-1777-4ee6-bdd4-6a2007e49d8f", title: "Ministry of Magic", **options)
280
+ stub_account_api_request(
281
+ :get,
282
+ "/api/saved-pages/#{CGI.escape(page_path)}",
283
+ response_body: {
284
+ saved_page: {
285
+ page_path: page_path,
286
+ content_id: content_id,
287
+ title: title,
288
+ },
289
+ },
290
+ **options,
291
+ )
292
+ end
293
+
294
+ def stub_account_api_does_not_have_saved_page(page_path:, **options)
295
+ stub_account_api_request(
296
+ :get,
297
+ "/api/saved-pages/#{CGI.escape(page_path)}",
298
+ response_status: 404,
299
+ **options,
300
+ )
301
+ end
302
+
303
+ def stub_account_api_unauthorized_get_saved_page(page_path:, **options)
304
+ stub_account_api_request(
305
+ :get,
306
+ "/api/saved-pages/#{CGI.escape(page_path)}",
307
+ response_status: 401,
308
+ **options,
309
+ )
310
+ end
311
+
312
+ #################################
313
+ # PUT /api/saved-pages/:page_path
314
+ #################################
315
+ def stub_account_api_save_page(page_path:, content_id: "c840bfa2-011a-42cc-ac7a-a6da990aff0b", title: "Ministry of Magic", **options)
316
+ stub_account_api_request(
317
+ :put,
318
+ "/api/saved-pages/#{CGI.escape(page_path)}",
319
+ response_body: {
320
+ saved_page: {
321
+ page_path: page_path,
322
+ content_id: content_id,
323
+ title: title,
324
+ },
325
+ },
326
+ **options,
327
+ )
328
+ end
329
+
330
+ def stub_account_api_save_page_already_exists(page_path:, **options)
331
+ stub_account_api_save_page(page_path: page_path, **options)
332
+ end
333
+
334
+ def stub_account_api_save_page_cannot_save_page(page_path:, **options)
335
+ stub_account_api_request(
336
+ :put,
337
+ "/api/saved-pages/#{CGI.escape(page_path)}",
338
+ response_status: 422,
339
+ response_body: cannot_save_page_problem_detail({ page_path: page_path }),
340
+ **options,
341
+ )
342
+ end
343
+
344
+ def stub_account_api_unauthorized_save_page(page_path:, **options)
345
+ stub_account_api_request(
346
+ :put,
347
+ "/api/saved-pages/#{CGI.escape(page_path)}",
348
+ response_status: 401,
349
+ **options,
350
+ )
351
+ end
352
+
353
+ def cannot_save_page_problem_detail(option = {})
354
+ {
355
+ title: "Cannot save page",
356
+ detail: "Cannot save page with path #{option['page_path']}, check it is not blank, and is a well formatted url path.",
357
+ type: "https://github.com/alphagov/account-api/blob/main/docs/api.md#cannot-save-page",
358
+ **option,
359
+ }
360
+ end
361
+
362
+ ####################################
363
+ # DELETE /api/saved-pages/:page_path
364
+ ####################################
365
+ def stub_account_api_delete_saved_page(page_path:, **options)
366
+ stub_account_api_request(
367
+ :delete,
368
+ "/api/saved-pages/#{CGI.escape(page_path)}",
369
+ response_status: 204,
370
+ **options,
371
+ )
372
+ end
373
+
374
+ def stub_account_api_delete_saved_page_does_not_exist(page_path:, **options)
375
+ stub_account_api_request(
376
+ :delete,
377
+ "/api/saved-pages/#{CGI.escape(page_path)}",
378
+ response_status: 404,
379
+ **options,
380
+ )
381
+ end
382
+
383
+ def stub_account_api_delete_saved_page_unauthorised(page_path:, **options)
384
+ stub_account_api_request(
385
+ :delete,
386
+ "/api/saved-pages/#{CGI.escape(page_path)}",
387
+ response_status: 401,
388
+ **options,
389
+ )
390
+ end
98
391
  end
99
392
  end
100
393
  end
@@ -72,23 +72,6 @@ module GdsApi
72
72
  headers: { "Content-Type" => "application/json" },
73
73
  )
74
74
  end
75
-
76
- def stub_link_checker_api_upsert_resource_monitor(app:, reference:, links:)
77
- response_body = { id: 1 }.to_json
78
-
79
- request_body = {
80
- links: links,
81
- app: app,
82
- reference: reference,
83
- }.to_json
84
-
85
- stub_request(:post, "#{LINK_CHECKER_API_ENDPOINT}/monitor")
86
- .with(body: request_body)
87
- .to_return(
88
- body: response_body,
89
- headers: { "Content-Type" => "application/json" },
90
- )
91
- end
92
75
  end
93
76
  end
94
77
  end
@@ -1,3 +1,3 @@
1
1
  module GdsApi
2
- VERSION = "70.0.0".freeze
2
+ VERSION = "71.4.0".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gds-api-adapters
3
3
  version: !ruby/object:Gem::Version
4
- version: 70.0.0
4
+ version: 71.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GOV.UK Dev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-15 00:00:00.000000000 Z
11
+ date: 2021-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -389,8 +389,6 @@ files:
389
389
  - lib/gds_api/maslow.rb
390
390
  - lib/gds_api/middleware/govuk_header_sniffer.rb
391
391
  - lib/gds_api/organisations.rb
392
- - lib/gds_api/performance_platform/data_in.rb
393
- - lib/gds_api/performance_platform/data_out.rb
394
392
  - lib/gds_api/publishing_api.rb
395
393
  - lib/gds_api/publishing_api/special_route_publisher.rb
396
394
  - lib/gds_api/railtie.rb
@@ -413,8 +411,6 @@ files:
413
411
  - lib/gds_api/test_helpers/local_links_manager.rb
414
412
  - lib/gds_api/test_helpers/mapit.rb
415
413
  - lib/gds_api/test_helpers/organisations.rb
416
- - lib/gds_api/test_helpers/performance_platform/data_in.rb
417
- - lib/gds_api/test_helpers/performance_platform/data_out.rb
418
414
  - lib/gds_api/test_helpers/publishing_api.rb
419
415
  - lib/gds_api/test_helpers/router.rb
420
416
  - lib/gds_api/test_helpers/search.rb
@@ -449,7 +445,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
449
445
  - !ruby/object:Gem::Version
450
446
  version: '0'
451
447
  requirements: []
452
- rubygems_version: 3.1.4
448
+ rubygems_version: 3.0.3
453
449
  signing_key:
454
450
  specification_version: 4
455
451
  summary: Adapters to work with GDS APIs
@@ -1,27 +0,0 @@
1
- require_relative "../base"
2
-
3
- module GdsApi
4
- class PerformancePlatformDatasetNotConfigured < BaseError; end
5
-
6
- module PerformancePlatform
7
- class DataIn < GdsApi::Base
8
- def submit_service_feedback_day_aggregate(slug, request_details)
9
- post_json("#{endpoint}/data/#{slug}/customer-satisfaction", request_details)
10
- rescue GdsApi::HTTPNotFound
11
- raise PerformancePlatformDatasetNotConfigured, "Dataset for slug [#{slug}] not set up"
12
- end
13
-
14
- def corporate_content_problem_report_count(entries)
15
- post_json("#{endpoint}/data/gov-uk-content/feedback-count", entries)
16
- end
17
-
18
- def corporate_content_urls_with_the_most_problem_reports(entries)
19
- post_json("#{endpoint}/data/gov-uk-content/top-urls", entries)
20
- end
21
-
22
- def submit_problem_report_daily_totals(entries)
23
- post_json("#{endpoint}/data/govuk-info/page-contacts", entries)
24
- end
25
- end
26
- end
27
- end
@@ -1,131 +0,0 @@
1
- require_relative "../base"
2
-
3
- module GdsApi
4
- module PerformancePlatform
5
- class DataOut < GdsApi::Base
6
- # Fetch all service feedback from the performance platform for a given transaction
7
- # page slug.
8
- #
9
- # Makes a +GET+ request.
10
- #
11
- # The results are ordered date ascending.
12
- #
13
- # @param transaction_page_slug [String] The slug for which service feedback is
14
- # needed.
15
- #
16
- # # @example
17
- #
18
- # performance_platform_data_out.service_feedback('register-to-vote')
19
- #
20
- # #=> {
21
- # "data": [
22
- # {
23
- # "_day_start_at": "2014-06-10T00:00:00+00:00",
24
- # "_hour_start_at": "2014-06-10T00:00:00+00:00",
25
- # "_id": "20140610_register-to-vote",
26
- # "_month_start_at": "2014-06-01T00:00:00+00:00",
27
- # "_quarter_start_at": "2014-04-01T00:00:00+00:00",
28
- # "_timestamp": "2014-06-10T00:00:00+00:00",
29
- # "_updated_at": "2014-06-11T00:30:50.901000+00:00",
30
- # "_week_start_at": "2014-06-09T00:00:00+00:00",
31
- # "comments": 217,
32
- # "period": "day",
33
- # "rating_1": 4,
34
- # "rating_2": 6,
35
- # "rating_3": 7,
36
- # "rating_4": 74,
37
- # "rating_5": 574,
38
- # "slug": "register-to-vote",
39
- # "total": 665
40
- # },
41
- # ...
42
- # }
43
- def service_feedback(transaction_page_slug)
44
- get_json("#{endpoint}/data/#{transaction_page_slug}/customer-satisfaction")
45
- end
46
-
47
- # Fetching statistics data from the performance platform for a given page slug
48
- #
49
- # Makes a +GET+ request.
50
- #
51
- # @param slug [String] Points to the page for which we are requesting
52
- # statistics.
53
- # @param is_multipart [Boolean] Flag that marks whether the slug is multipart
54
- # or not:
55
- #
56
- # - simple: `/european-health-insurance-card`
57
- # - multipart: `/european-health-insurance-card/123`
58
- #
59
- # # @examples
60
- #
61
- # 1. Without multipart filtering:
62
- #
63
- # performance_platform_data_out.search_terms('/european-health-insurance-card')
64
- #
65
- # 2. With multipart filtering:
66
- #
67
- # performance_platform_data_out.searches('/european-health-insurance-card', true)
68
- # performance_platform_data_out.page_views('/european-health-insurance-card', true)
69
- # performance_platform_data_out.problem_reports('/european-health-insurance-card', true)
70
-
71
- def search_terms(slug)
72
- options = {
73
- slug: slug,
74
- transaction: "search-terms",
75
- group_by: "searchKeyword",
76
- collect: "searchUniques:sum",
77
- }
78
- statistics(options)
79
- end
80
-
81
- def searches(slug, is_multipart)
82
- options = {
83
- slug: slug,
84
- transaction: "search-terms",
85
- group_by: "pagePath",
86
- collect: "searchUniques:sum",
87
- }
88
- statistics(options, is_multipart)
89
- end
90
-
91
- def page_views(slug, is_multipart)
92
- options = {
93
- slug: slug,
94
- transaction: "page-statistics",
95
- group_by: "pagePath",
96
- collect: "uniquePageviews:sum",
97
- }
98
- statistics(options, is_multipart)
99
- end
100
-
101
- def problem_reports(slug, is_multipart)
102
- options = {
103
- slug: slug,
104
- transaction: "page-contacts",
105
- group_by: "pagePath",
106
- collect: "total:sum",
107
- }
108
- statistics(options, is_multipart)
109
- end
110
-
111
- # This can be used as a free form call to the performance platform.
112
- # The performance platform uses Backdrop and its query language for
113
- # storing and querying data.
114
- # Backdrop can be found here: https://github.com/alphagov/backdrop
115
- def statistics(options, is_multipart = false) # rubocop:disable Style/OptionalBooleanParameter
116
- params = {
117
- group_by: options[:group_by],
118
- collect: options[:collect],
119
- duration: 42,
120
- period: "day",
121
- end_at: Date.today.to_time.getutc.iso8601,
122
- }
123
-
124
- filter_param = is_multipart ? :filter_by_prefix : :filter_by
125
- params[filter_param] = "pagePath:#{options[:slug]}"
126
-
127
- get_json("#{endpoint}/data/govuk-info/#{options[:transaction]}#{query_string(params)}")
128
- end
129
- end
130
- end
131
- end
@@ -1,45 +0,0 @@
1
- module GdsApi
2
- module TestHelpers
3
- module PerformancePlatform
4
- module DataIn
5
- PP_DATA_IN_ENDPOINT = "http://www.performance.dev.gov.uk".freeze
6
-
7
- def stub_service_feedback_day_aggregate_submission(slug, request_body = nil)
8
- post_stub = stub_http_request(:post, "#{PP_DATA_IN_ENDPOINT}/data/#{slug}/customer-satisfaction")
9
- post_stub.with(body: request_body) unless request_body.nil?
10
- post_stub.to_return(status: 200)
11
- end
12
-
13
- def stub_corporate_content_problem_report_count_submission(submissions = nil)
14
- post_stub = stub_http_request(:post, "#{PP_DATA_IN_ENDPOINT}/data/gov-uk-content/feedback-count")
15
- post_stub.with(body: submissions.to_json) unless submissions.nil?
16
- post_stub.to_return(status: 200)
17
- end
18
-
19
- def stub_corporate_content_urls_with_the_most_problem_reports_submission(submissions = nil)
20
- post_stub = stub_http_request(:post, "#{PP_DATA_IN_ENDPOINT}/data/gov-uk-content/top-urls")
21
- post_stub.with(body: submissions.to_json) unless submissions.nil?
22
- post_stub.to_return(status: 200)
23
- end
24
-
25
- def stub_problem_report_daily_totals_submission(submissions = nil)
26
- post_stub = stub_http_request(:post, "#{PP_DATA_IN_ENDPOINT}/data/govuk-info/page-contacts")
27
- post_stub.with(body: submissions.to_json) unless submissions.nil?
28
- post_stub.to_return(status: 200)
29
- end
30
-
31
- def stub_service_feedback_bucket_unavailable_for(slug)
32
- stub_request(:post, "#{PP_DATA_IN_ENDPOINT}/data/#{slug}/customer-satisfaction").to_return(status: 404)
33
- end
34
-
35
- def stub_pp_isnt_available
36
- stub_request(:post, /#{PP_DATA_IN_ENDPOINT}\/.*/).to_return(status: 503)
37
- end
38
-
39
- def stub_pp_dataset_unavailable
40
- stub_request(:any, /#{PP_DATA_IN_ENDPOINT}/).to_return(status: 404)
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,98 +0,0 @@
1
- module GdsApi
2
- module TestHelpers
3
- module PerformancePlatform
4
- module DataOut
5
- PP_DATA_OUT_ENDPOINT = "https://www.performance.service.gov.uk".freeze
6
-
7
- def stub_service_feedback(slug, response_body = {})
8
- stub_http_request(:get, "#{PP_DATA_OUT_ENDPOINT}/data/#{slug}/customer-satisfaction")
9
- .to_return(status: 200, body: response_body.to_json)
10
- end
11
-
12
- def stub_data_set_not_available(slug)
13
- stub_http_request(:get, "#{PP_DATA_OUT_ENDPOINT}/data/#{slug}/customer-satisfaction")
14
- .to_return(status: 404)
15
- end
16
-
17
- def stub_service_not_available
18
- stub_request(:any, /#{PP_DATA_OUT_ENDPOINT}\/.*/).to_return(status: 503)
19
- end
20
-
21
- def stub_search_terms(slug, response_body = {})
22
- options = {
23
- slug: slug,
24
- transaction: "search-terms",
25
- group_by: "searchKeyword",
26
- collect: "searchUniques:sum",
27
- }
28
- stub_statistics(options, false, response_body)
29
- end
30
-
31
- def stub_searches(slug, is_multipart, response_body = {})
32
- options = {
33
- slug: slug,
34
- transaction: "search-terms",
35
- group_by: "pagePath",
36
- collect: "searchUniques:sum",
37
- }
38
- stub_statistics(options, is_multipart, response_body)
39
- end
40
-
41
- def stub_page_views(slug, is_multipart, response_body = {})
42
- options = {
43
- slug: slug,
44
- transaction: "page-statistics",
45
- group_by: "pagePath",
46
- collect: "uniquePageviews:sum",
47
- }
48
- stub_statistics(options, is_multipart, response_body)
49
- end
50
-
51
- def stub_problem_reports(slug, is_multipart, response_body = {})
52
- options = {
53
- slug: slug,
54
- transaction: "page-contacts",
55
- group_by: "pagePath",
56
- collect: "total:sum",
57
- }
58
- stub_statistics(options, is_multipart, response_body)
59
- end
60
-
61
- def stub_statistics(options, is_multipart, response_body = {})
62
- params = {
63
- group_by: options[:group_by],
64
- collect: options[:collect],
65
- duration: 42,
66
- period: "day",
67
- end_at: Date.today.to_time.getutc.iso8601,
68
- }
69
-
70
- filter_param = is_multipart ? :filter_by_prefix : :filter_by
71
- params[filter_param] = "pagePath:#{options[:slug]}"
72
-
73
- stub_http_request(:get, "#{PP_DATA_OUT_ENDPOINT}/data/govuk-info/#{options[:transaction]}")
74
- .with(query: params)
75
- .to_return(status: 200, body: response_body.to_json)
76
- end
77
-
78
- def stub_search_404(slug)
79
- stub_request(:get, "#{PP_DATA_OUT_ENDPOINT}/data/govuk-info/search-terms")
80
- .with(query: hash_including(filter_by: slug))
81
- .to_return(status: 404, headers: { content_type: "application/json" })
82
- end
83
-
84
- def stub_page_views_404(slug)
85
- stub_request(:get, "#{PP_DATA_OUT_ENDPOINT}/data/govuk-info/page-statistics")
86
- .with(query: hash_including(filter_by: slug))
87
- .to_return(status: 404, headers: { content_type: "application/json" })
88
- end
89
-
90
- def stub_problem_reports_404(slug)
91
- stub_request(:get, "#{PP_DATA_OUT_ENDPOINT}/data/govuk-info/page-contacts")
92
- .with(query: hash_including(filter_by: slug))
93
- .to_return(status: 404, headers: { content_type: "application/json" })
94
- end
95
- end
96
- end
97
- end
98
- end