gocardless_pro 2.25.0 → 2.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +3 -3
  3. data/lib/gocardless_pro.rb +18 -0
  4. data/lib/gocardless_pro/client.rb +31 -1
  5. data/lib/gocardless_pro/resources/bank_authorisation.rb +87 -0
  6. data/lib/gocardless_pro/resources/billing_request.rb +86 -0
  7. data/lib/gocardless_pro/resources/billing_request_flow.rb +62 -0
  8. data/lib/gocardless_pro/resources/creditor.rb +2 -3
  9. data/lib/gocardless_pro/resources/institution.rb +45 -0
  10. data/lib/gocardless_pro/resources/payer_authorisation.rb +3 -0
  11. data/lib/gocardless_pro/resources/scenario_simulator.rb +42 -0
  12. data/lib/gocardless_pro/resources/webhook.rb +62 -0
  13. data/lib/gocardless_pro/services/bank_authorisations_service.rb +82 -0
  14. data/lib/gocardless_pro/services/billing_request_flows_service.rb +47 -0
  15. data/lib/gocardless_pro/services/billing_requests_service.rb +325 -0
  16. data/lib/gocardless_pro/services/institutions_service.rb +56 -0
  17. data/lib/gocardless_pro/services/payer_authorisations_service.rb +5 -5
  18. data/lib/gocardless_pro/services/scenario_simulators_service.rb +148 -0
  19. data/lib/gocardless_pro/services/subscriptions_service.rb +8 -3
  20. data/lib/gocardless_pro/services/webhooks_service.rb +113 -0
  21. data/lib/gocardless_pro/version.rb +1 -1
  22. data/spec/resources/bank_authorisation_spec.rb +259 -0
  23. data/spec/resources/billing_request_flow_spec.rb +129 -0
  24. data/spec/resources/billing_request_spec.rb +736 -0
  25. data/spec/resources/institution_spec.rb +103 -0
  26. data/spec/resources/scenario_simulator_spec.rb +63 -0
  27. data/spec/resources/webhook_spec.rb +323 -0
  28. data/spec/services/bank_authorisations_service_spec.rb +366 -0
  29. data/spec/services/billing_request_flows_service_spec.rb +152 -0
  30. data/spec/services/billing_requests_service_spec.rb +1042 -0
  31. data/spec/services/institutions_service_spec.rb +223 -0
  32. data/spec/services/scenario_simulators_service_spec.rb +74 -0
  33. data/spec/services/webhooks_service_spec.rb +545 -0
  34. metadata +39 -3
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+
3
+ #
4
+ # This client is automatically generated from a template and JSON schema definition.
5
+ # See https://github.com/gocardless/gocardless-pro-ruby#contributing before editing.
6
+ #
7
+
8
+ require 'uri'
9
+
10
+ module GoCardlessPro
11
+ # A module containing classes for each of the resources in the GC Api
12
+ module Resources
13
+ # Represents an instance of a scenario_simulator resource returned from the API
14
+
15
+ # Scenario Simulators allow you to manually trigger and test certain paths
16
+ # that your
17
+ # integration will encounter in the real world. These endpoints are only
18
+ # active in the
19
+ # sandbox environment.
20
+ class ScenarioSimulator
21
+ attr_reader :id
22
+
23
+ # Initialize a scenario_simulator resource instance
24
+ # @param object [Hash] an object returned from the API
25
+ def initialize(object, response = nil)
26
+ @object = object
27
+
28
+ @id = object['id']
29
+ @response = response
30
+ end
31
+
32
+ def api_response
33
+ ApiResponse.new(@response)
34
+ end
35
+
36
+ # Provides the scenario_simulator resource as a hash of all its readable attributes
37
+ def to_h
38
+ @object
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+
3
+ #
4
+ # This client is automatically generated from a template and JSON schema definition.
5
+ # See https://github.com/gocardless/gocardless-pro-ruby#contributing before editing.
6
+ #
7
+
8
+ require 'uri'
9
+
10
+ module GoCardlessPro
11
+ # A module containing classes for each of the resources in the GC Api
12
+ module Resources
13
+ # Represents an instance of a webhook resource returned from the API
14
+
15
+ # Basic description of a webhook
16
+ class Webhook
17
+ attr_reader :created_at
18
+ attr_reader :id
19
+ attr_reader :is_test
20
+ attr_reader :request_body
21
+ attr_reader :request_headers
22
+ attr_reader :response_body
23
+ attr_reader :response_body_truncated
24
+ attr_reader :response_code
25
+ attr_reader :response_headers
26
+ attr_reader :response_headers_content_truncated
27
+ attr_reader :response_headers_count_truncated
28
+ attr_reader :successful
29
+ attr_reader :url
30
+
31
+ # Initialize a webhook resource instance
32
+ # @param object [Hash] an object returned from the API
33
+ def initialize(object, response = nil)
34
+ @object = object
35
+
36
+ @created_at = object['created_at']
37
+ @id = object['id']
38
+ @is_test = object['is_test']
39
+ @request_body = object['request_body']
40
+ @request_headers = object['request_headers']
41
+ @response_body = object['response_body']
42
+ @response_body_truncated = object['response_body_truncated']
43
+ @response_code = object['response_code']
44
+ @response_headers = object['response_headers']
45
+ @response_headers_content_truncated = object['response_headers_content_truncated']
46
+ @response_headers_count_truncated = object['response_headers_count_truncated']
47
+ @successful = object['successful']
48
+ @url = object['url']
49
+ @response = response
50
+ end
51
+
52
+ def api_response
53
+ ApiResponse.new(@response)
54
+ end
55
+
56
+ # Provides the webhook resource as a hash of all its readable attributes
57
+ def to_h
58
+ @object
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,82 @@
1
+ require_relative './base_service'
2
+
3
+ # encoding: utf-8
4
+ #
5
+ # This client is automatically generated from a template and JSON schema definition.
6
+ # See https://github.com/gocardless/gocardless-pro-ruby#contributing before editing.
7
+ #
8
+
9
+ module GoCardlessPro
10
+ module Services
11
+ # Service for making requests to the BankAuthorisation endpoints
12
+ class BankAuthorisationsService < BaseService
13
+ # Fetches a bank authorisation
14
+ # Example URL: /bank_authorisations/:identity
15
+ #
16
+ # @param identity # Unique identifier, beginning with "BAU".
17
+ # @param options [Hash] parameters as a hash, under a params key.
18
+ def get(identity, options = {})
19
+ path = sub_url('/bank_authorisations/:identity', 'identity' => identity)
20
+
21
+ options[:retry_failures] = true
22
+
23
+ response = make_request(:get, path, options)
24
+
25
+ return if response.body.nil?
26
+
27
+ Resources::BankAuthorisation.new(unenvelope_body(response.body), response)
28
+ end
29
+
30
+ # Create a Bank Authorisation.
31
+ # Example URL: /bank_authorisations
32
+ # @param options [Hash] parameters as a hash, under a params key.
33
+ def create(options = {})
34
+ path = '/bank_authorisations'
35
+
36
+ params = options.delete(:params) || {}
37
+ options[:params] = {}
38
+ options[:params][envelope_key] = params
39
+
40
+ options[:retry_failures] = true
41
+
42
+ begin
43
+ response = make_request(:post, path, options)
44
+
45
+ # Response doesn't raise any errors until #body is called
46
+ response.tap(&:body)
47
+ rescue InvalidStateError => e
48
+ if e.idempotent_creation_conflict?
49
+ case @api_service.on_idempotency_conflict
50
+ when :raise
51
+ raise IdempotencyConflict, e.error
52
+ when :fetch
53
+ return get(e.conflicting_resource_id)
54
+ else
55
+ raise ArgumentError, 'Unknown mode for :on_idempotency_conflict'
56
+ end
57
+ end
58
+
59
+ raise e
60
+ end
61
+
62
+ return if response.body.nil?
63
+
64
+ Resources::BankAuthorisation.new(unenvelope_body(response.body), response)
65
+ end
66
+
67
+ private
68
+
69
+ # Unenvelope the response of the body using the service's `envelope_key`
70
+ #
71
+ # @param body [Hash]
72
+ def unenvelope_body(body)
73
+ body[envelope_key] || body['data']
74
+ end
75
+
76
+ # return the key which API responses will envelope data under
77
+ def envelope_key
78
+ 'bank_authorisations'
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,47 @@
1
+ require_relative './base_service'
2
+
3
+ # encoding: utf-8
4
+ #
5
+ # This client is automatically generated from a template and JSON schema definition.
6
+ # See https://github.com/gocardless/gocardless-pro-ruby#contributing before editing.
7
+ #
8
+
9
+ module GoCardlessPro
10
+ module Services
11
+ # Service for making requests to the BillingRequestFlow endpoints
12
+ class BillingRequestFlowsService < BaseService
13
+ # Creates a new billing request flow.
14
+ # Example URL: /billing_request_flows
15
+ # @param options [Hash] parameters as a hash, under a params key.
16
+ def create(options = {})
17
+ path = '/billing_request_flows'
18
+
19
+ params = options.delete(:params) || {}
20
+ options[:params] = {}
21
+ options[:params][envelope_key] = params
22
+
23
+ options[:retry_failures] = true
24
+
25
+ response = make_request(:post, path, options)
26
+
27
+ return if response.body.nil?
28
+
29
+ Resources::BillingRequestFlow.new(unenvelope_body(response.body), response)
30
+ end
31
+
32
+ private
33
+
34
+ # Unenvelope the response of the body using the service's `envelope_key`
35
+ #
36
+ # @param body [Hash]
37
+ def unenvelope_body(body)
38
+ body[envelope_key] || body['data']
39
+ end
40
+
41
+ # return the key which API responses will envelope data under
42
+ def envelope_key
43
+ 'billing_request_flows'
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,325 @@
1
+ require_relative './base_service'
2
+
3
+ # encoding: utf-8
4
+ #
5
+ # This client is automatically generated from a template and JSON schema definition.
6
+ # See https://github.com/gocardless/gocardless-pro-ruby#contributing before editing.
7
+ #
8
+
9
+ module GoCardlessPro
10
+ module Services
11
+ # Service for making requests to the BillingRequest endpoints
12
+ class BillingRequestsService < BaseService
13
+ # Returns a [cursor-paginated](#api-usage-cursor-pagination) list of your
14
+ # billing_requests.
15
+ # Example URL: /billing_requests
16
+ # @param options [Hash] parameters as a hash, under a params key.
17
+ def list(options = {})
18
+ path = '/billing_requests'
19
+
20
+ options[:retry_failures] = true
21
+
22
+ response = make_request(:get, path, options)
23
+
24
+ ListResponse.new(
25
+ response: response,
26
+ unenveloped_body: unenvelope_body(response.body),
27
+ resource_class: Resources::BillingRequest
28
+ )
29
+ end
30
+
31
+ # Get a lazily enumerated list of all the items returned. This is simmilar to the `list` method but will paginate for you automatically.
32
+ #
33
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
34
+ # Otherwise they will be the body of the request.
35
+ def all(options = {})
36
+ Paginator.new(
37
+ service: self,
38
+ options: options
39
+ ).enumerator
40
+ end
41
+
42
+ #
43
+ # Example URL: /billing_requests
44
+ # @param options [Hash] parameters as a hash, under a params key.
45
+ def create(options = {})
46
+ path = '/billing_requests'
47
+
48
+ params = options.delete(:params) || {}
49
+ options[:params] = {}
50
+ options[:params][envelope_key] = params
51
+
52
+ options[:retry_failures] = true
53
+
54
+ begin
55
+ response = make_request(:post, path, options)
56
+
57
+ # Response doesn't raise any errors until #body is called
58
+ response.tap(&:body)
59
+ rescue InvalidStateError => e
60
+ if e.idempotent_creation_conflict?
61
+ case @api_service.on_idempotency_conflict
62
+ when :raise
63
+ raise IdempotencyConflict, e.error
64
+ when :fetch
65
+ return get(e.conflicting_resource_id)
66
+ else
67
+ raise ArgumentError, 'Unknown mode for :on_idempotency_conflict'
68
+ end
69
+ end
70
+
71
+ raise e
72
+ end
73
+
74
+ return if response.body.nil?
75
+
76
+ Resources::BillingRequest.new(unenvelope_body(response.body), response)
77
+ end
78
+
79
+ # Fetches a billing request
80
+ # Example URL: /billing_requests/:identity
81
+ #
82
+ # @param identity # Unique identifier, beginning with "PY".
83
+ # @param options [Hash] parameters as a hash, under a params key.
84
+ def get(identity, options = {})
85
+ path = sub_url('/billing_requests/:identity', 'identity' => identity)
86
+
87
+ options[:retry_failures] = true
88
+
89
+ response = make_request(:get, path, options)
90
+
91
+ return if response.body.nil?
92
+
93
+ Resources::BillingRequest.new(unenvelope_body(response.body), response)
94
+ end
95
+
96
+ # If the billing request has a pending <code>collect_customer_details</code>
97
+ # action, this endpoint can be used to collect the details in order to
98
+ # complete it.
99
+ #
100
+ # The endpoint takes the same payload as Customers, but checks that the
101
+ # customer fields are populated correctly for the billing request scheme.
102
+ #
103
+ # Whatever is provided to this endpoint is used to update the referenced
104
+ # customer, and will take effect immediately after the request is
105
+ # successful.
106
+ # Example URL: /billing_requests/:identity/actions/collect_customer_details
107
+ #
108
+ # @param identity # Unique identifier, beginning with "PY".
109
+ # @param options [Hash] parameters as a hash, under a params key.
110
+ def collect_customer_details(identity, options = {})
111
+ path = sub_url('/billing_requests/:identity/actions/collect_customer_details', 'identity' => identity)
112
+
113
+ params = options.delete(:params) || {}
114
+ options[:params] = {}
115
+ options[:params]['data'] = params
116
+
117
+ options[:retry_failures] = false
118
+
119
+ begin
120
+ response = make_request(:post, path, options)
121
+
122
+ # Response doesn't raise any errors until #body is called
123
+ response.tap(&:body)
124
+ rescue InvalidStateError => e
125
+ if e.idempotent_creation_conflict?
126
+ case @api_service.on_idempotency_conflict
127
+ when :raise
128
+ raise IdempotencyConflict, e.error
129
+ when :fetch
130
+ return get(e.conflicting_resource_id)
131
+ else
132
+ raise ArgumentError, 'Unknown mode for :on_idempotency_conflict'
133
+ end
134
+ end
135
+
136
+ raise e
137
+ end
138
+
139
+ return if response.body.nil?
140
+
141
+ Resources::BillingRequest.new(unenvelope_body(response.body), response)
142
+ end
143
+
144
+ # If the billing request has a pending
145
+ # <code>collect_bank_account_details</code> action, this endpoint can be
146
+ # used to collect the details in order to complete it.
147
+ #
148
+ # The endpoint takes the same payload as Customer Bank Accounts, but check
149
+ # the bank account is valid for the billing request scheme before creating
150
+ # and attaching it.
151
+ # Example URL: /billing_requests/:identity/actions/collect_bank_account_details
152
+ #
153
+ # @param identity # Unique identifier, beginning with "PY".
154
+ # @param options [Hash] parameters as a hash, under a params key.
155
+ def collect_bank_account_details(identity, options = {})
156
+ path = sub_url('/billing_requests/:identity/actions/collect_bank_account_details', 'identity' => identity)
157
+
158
+ params = options.delete(:params) || {}
159
+ options[:params] = {}
160
+ options[:params]['data'] = params
161
+
162
+ options[:retry_failures] = false
163
+
164
+ begin
165
+ response = make_request(:post, path, options)
166
+
167
+ # Response doesn't raise any errors until #body is called
168
+ response.tap(&:body)
169
+ rescue InvalidStateError => e
170
+ if e.idempotent_creation_conflict?
171
+ case @api_service.on_idempotency_conflict
172
+ when :raise
173
+ raise IdempotencyConflict, e.error
174
+ when :fetch
175
+ return get(e.conflicting_resource_id)
176
+ else
177
+ raise ArgumentError, 'Unknown mode for :on_idempotency_conflict'
178
+ end
179
+ end
180
+
181
+ raise e
182
+ end
183
+
184
+ return if response.body.nil?
185
+
186
+ Resources::BillingRequest.new(unenvelope_body(response.body), response)
187
+ end
188
+
189
+ # If a billing request is ready to be fulfilled, call this endpoint to cause
190
+ # it to fulfil, executing the payment.
191
+ # Example URL: /billing_requests/:identity/actions/fulfil
192
+ #
193
+ # @param identity # Unique identifier, beginning with "PY".
194
+ # @param options [Hash] parameters as a hash, under a params key.
195
+ def fulfil(identity, options = {})
196
+ path = sub_url('/billing_requests/:identity/actions/fulfil', 'identity' => identity)
197
+
198
+ params = options.delete(:params) || {}
199
+ options[:params] = {}
200
+ options[:params]['data'] = params
201
+
202
+ options[:retry_failures] = false
203
+
204
+ begin
205
+ response = make_request(:post, path, options)
206
+
207
+ # Response doesn't raise any errors until #body is called
208
+ response.tap(&:body)
209
+ rescue InvalidStateError => e
210
+ if e.idempotent_creation_conflict?
211
+ case @api_service.on_idempotency_conflict
212
+ when :raise
213
+ raise IdempotencyConflict, e.error
214
+ when :fetch
215
+ return get(e.conflicting_resource_id)
216
+ else
217
+ raise ArgumentError, 'Unknown mode for :on_idempotency_conflict'
218
+ end
219
+ end
220
+
221
+ raise e
222
+ end
223
+
224
+ return if response.body.nil?
225
+
226
+ Resources::BillingRequest.new(unenvelope_body(response.body), response)
227
+ end
228
+
229
+ # Immediately cancels a billing request, causing all billing request flows
230
+ # to expire.
231
+ # Example URL: /billing_requests/:identity/actions/cancel
232
+ #
233
+ # @param identity # Unique identifier, beginning with "PY".
234
+ # @param options [Hash] parameters as a hash, under a params key.
235
+ def cancel(identity, options = {})
236
+ path = sub_url('/billing_requests/:identity/actions/cancel', 'identity' => identity)
237
+
238
+ params = options.delete(:params) || {}
239
+ options[:params] = {}
240
+ options[:params]['data'] = params
241
+
242
+ options[:retry_failures] = false
243
+
244
+ begin
245
+ response = make_request(:post, path, options)
246
+
247
+ # Response doesn't raise any errors until #body is called
248
+ response.tap(&:body)
249
+ rescue InvalidStateError => e
250
+ if e.idempotent_creation_conflict?
251
+ case @api_service.on_idempotency_conflict
252
+ when :raise
253
+ raise IdempotencyConflict, e.error
254
+ when :fetch
255
+ return get(e.conflicting_resource_id)
256
+ else
257
+ raise ArgumentError, 'Unknown mode for :on_idempotency_conflict'
258
+ end
259
+ end
260
+
261
+ raise e
262
+ end
263
+
264
+ return if response.body.nil?
265
+
266
+ Resources::BillingRequest.new(unenvelope_body(response.body), response)
267
+ end
268
+
269
+ # Notifies the customer linked to the billing request, asking them to authorise
270
+ # it.
271
+ # Currently, the customer can only be notified by email.
272
+ # Example URL: /billing_requests/:identity/actions/notify
273
+ #
274
+ # @param identity # Unique identifier, beginning with "PY".
275
+ # @param options [Hash] parameters as a hash, under a params key.
276
+ def notify(identity, options = {})
277
+ path = sub_url('/billing_requests/:identity/actions/notify', 'identity' => identity)
278
+
279
+ params = options.delete(:params) || {}
280
+ options[:params] = {}
281
+ options[:params]['data'] = params
282
+
283
+ options[:retry_failures] = false
284
+
285
+ begin
286
+ response = make_request(:post, path, options)
287
+
288
+ # Response doesn't raise any errors until #body is called
289
+ response.tap(&:body)
290
+ rescue InvalidStateError => e
291
+ if e.idempotent_creation_conflict?
292
+ case @api_service.on_idempotency_conflict
293
+ when :raise
294
+ raise IdempotencyConflict, e.error
295
+ when :fetch
296
+ return get(e.conflicting_resource_id)
297
+ else
298
+ raise ArgumentError, 'Unknown mode for :on_idempotency_conflict'
299
+ end
300
+ end
301
+
302
+ raise e
303
+ end
304
+
305
+ return if response.body.nil?
306
+
307
+ Resources::BillingRequest.new(unenvelope_body(response.body), response)
308
+ end
309
+
310
+ private
311
+
312
+ # Unenvelope the response of the body using the service's `envelope_key`
313
+ #
314
+ # @param body [Hash]
315
+ def unenvelope_body(body)
316
+ body[envelope_key] || body['data']
317
+ end
318
+
319
+ # return the key which API responses will envelope data under
320
+ def envelope_key
321
+ 'billing_requests'
322
+ end
323
+ end
324
+ end
325
+ end