gocardless-pro 0.1.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 (91) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +2 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +132 -0
  6. data/circle.yml +18 -0
  7. data/demo.rb +10 -0
  8. data/gocardless-pro.gemspec +27 -0
  9. data/lib/gocardless-pro.rb +243 -0
  10. data/lib/gocardless-pro/api_service.rb +57 -0
  11. data/lib/gocardless-pro/error.rb +42 -0
  12. data/lib/gocardless-pro/error/gocardless_error.rb +5 -0
  13. data/lib/gocardless-pro/error/invalid_api_usage_error.rb +5 -0
  14. data/lib/gocardless-pro/error/invalid_state_error.rb +5 -0
  15. data/lib/gocardless-pro/error/validation_error.rb +5 -0
  16. data/lib/gocardless-pro/list_response.rb +34 -0
  17. data/lib/gocardless-pro/paginator.rb +37 -0
  18. data/lib/gocardless-pro/request.rb +69 -0
  19. data/lib/gocardless-pro/resources/api_key.rb +62 -0
  20. data/lib/gocardless-pro/resources/creditor.rb +83 -0
  21. data/lib/gocardless-pro/resources/creditor_bank_account.rb +78 -0
  22. data/lib/gocardless-pro/resources/customer.rb +72 -0
  23. data/lib/gocardless-pro/resources/customer_bank_account.rb +80 -0
  24. data/lib/gocardless-pro/resources/event.rb +75 -0
  25. data/lib/gocardless-pro/resources/helper.rb +29 -0
  26. data/lib/gocardless-pro/resources/mandate.rb +70 -0
  27. data/lib/gocardless-pro/resources/payment.rb +86 -0
  28. data/lib/gocardless-pro/resources/payout.rb +66 -0
  29. data/lib/gocardless-pro/resources/publishable_api_key.rb +51 -0
  30. data/lib/gocardless-pro/resources/redirect_flow.rb +104 -0
  31. data/lib/gocardless-pro/resources/refund.rb +70 -0
  32. data/lib/gocardless-pro/resources/role.rb +101 -0
  33. data/lib/gocardless-pro/resources/subscription.rb +152 -0
  34. data/lib/gocardless-pro/resources/user.rb +60 -0
  35. data/lib/gocardless-pro/response.rb +77 -0
  36. data/lib/gocardless-pro/services/api_key_service.rb +130 -0
  37. data/lib/gocardless-pro/services/base_service.rb +29 -0
  38. data/lib/gocardless-pro/services/creditor_bank_account_service.rb +122 -0
  39. data/lib/gocardless-pro/services/creditor_service.rb +112 -0
  40. data/lib/gocardless-pro/services/customer_bank_account_service.rb +153 -0
  41. data/lib/gocardless-pro/services/customer_service.rb +112 -0
  42. data/lib/gocardless-pro/services/event_service.rb +80 -0
  43. data/lib/gocardless-pro/services/helper_service.rb +97 -0
  44. data/lib/gocardless-pro/services/mandate_service.rb +170 -0
  45. data/lib/gocardless-pro/services/payment_service.rb +164 -0
  46. data/lib/gocardless-pro/services/payout_service.rb +80 -0
  47. data/lib/gocardless-pro/services/publishable_api_key_service.rb +130 -0
  48. data/lib/gocardless-pro/services/redirect_flow_service.rb +96 -0
  49. data/lib/gocardless-pro/services/refund_service.rb +126 -0
  50. data/lib/gocardless-pro/services/role_service.rb +127 -0
  51. data/lib/gocardless-pro/services/subscription_service.rb +133 -0
  52. data/lib/gocardless-pro/services/user_service.rb +148 -0
  53. data/lib/gocardless-pro/version.rb +8 -0
  54. data/spec/api_service_spec.rb +69 -0
  55. data/spec/client_spec.rb +29 -0
  56. data/spec/error_spec.rb +44 -0
  57. data/spec/resources/api_key_spec.rb +85 -0
  58. data/spec/resources/creditor_bank_account_spec.rb +109 -0
  59. data/spec/resources/creditor_spec.rb +125 -0
  60. data/spec/resources/customer_bank_account_spec.rb +109 -0
  61. data/spec/resources/customer_spec.rb +127 -0
  62. data/spec/resources/event_spec.rb +113 -0
  63. data/spec/resources/helper_spec.rb +23 -0
  64. data/spec/resources/mandate_spec.rb +97 -0
  65. data/spec/resources/payment_spec.rb +129 -0
  66. data/spec/resources/payout_spec.rb +89 -0
  67. data/spec/resources/publishable_api_key_spec.rb +63 -0
  68. data/spec/resources/redirect_flow_spec.rb +97 -0
  69. data/spec/resources/refund_spec.rb +77 -0
  70. data/spec/resources/role_spec.rb +63 -0
  71. data/spec/resources/subscription_spec.rb +157 -0
  72. data/spec/resources/user_spec.rb +85 -0
  73. data/spec/response_spec.rb +79 -0
  74. data/spec/services/api_key_service_spec.rb +362 -0
  75. data/spec/services/creditor_bank_account_service_spec.rb +365 -0
  76. data/spec/services/creditor_service_spec.rb +339 -0
  77. data/spec/services/customer_bank_account_service_spec.rb +404 -0
  78. data/spec/services/customer_service_spec.rb +365 -0
  79. data/spec/services/event_service_spec.rb +172 -0
  80. data/spec/services/helper_service_spec.rb +123 -0
  81. data/spec/services/mandate_service_spec.rb +449 -0
  82. data/spec/services/payment_service_spec.rb +497 -0
  83. data/spec/services/payout_service_spec.rb +172 -0
  84. data/spec/services/publishable_api_key_service_spec.rb +336 -0
  85. data/spec/services/redirect_flow_service_spec.rb +208 -0
  86. data/spec/services/refund_service_spec.rb +279 -0
  87. data/spec/services/role_service_spec.rb +336 -0
  88. data/spec/services/subscription_service_spec.rb +488 -0
  89. data/spec/services/user_service_spec.rb +433 -0
  90. data/spec/spec_helper.rb +91 -0
  91. metadata +255 -0
@@ -0,0 +1,153 @@
1
+ require_relative './base_service'
2
+
3
+ # encoding: utf-8
4
+ #
5
+ # WARNING: Do not edit by hand, this file was generated by Crank:
6
+ #
7
+ # https://github.com/gocardless/crank
8
+
9
+ module GoCardless
10
+ module Services
11
+ # Service for making requests to the CustomerBankAccount endpoints
12
+ class CustomerBankAccountService < BaseService
13
+ # Creates a new bank account object associated to a customer id.
14
+ #
15
+ # There are
16
+ # three different ways to supply bank account details:
17
+ #
18
+ # - [Local
19
+ # details](https://developer.gocardless.com/pro/#ui-compliance-local-bank-details)
20
+ #
21
+ #
22
+ # - IBAN
23
+ #
24
+ # - [Customer Bank Account
25
+ # Tokens](https://developer.gocardless.com/pro/#js-flow-create-a-customer-bank-account-token)
26
+ #
27
+ #
28
+ # For more information on the different fields required in each country, see
29
+ # [local bank
30
+ # details](https://developer.gocardless.com/pro/#ui-compliance-local-bank-details).
31
+ # Example URL: /customer_bank_accounts
32
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
33
+ # Else, they will be the body of the request.
34
+ def create(options = {}, custom_headers = {})
35
+ path = '/customer_bank_accounts'
36
+ new_options = {}
37
+ new_options[envelope_key] = options
38
+ options = new_options
39
+ response = make_request(:post, path, options, custom_headers)
40
+
41
+ Resources::CustomerBankAccount.new(unenvelope_body(response.body))
42
+ end
43
+
44
+ # Returns a
45
+ # [cursor-paginated](https://developer.gocardless.com/pro/#overview-cursor-pagination)
46
+ # list of your bank accounts.
47
+ # Example URL: /customer_bank_accounts
48
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
49
+ # Else, they will be the body of the request.
50
+ def list(options = {}, custom_headers = {})
51
+ path = '/customer_bank_accounts'
52
+
53
+ response = make_request(:get, path, options, custom_headers)
54
+ ListResponse.new(
55
+ raw_response: response,
56
+ unenveloped_body: unenvelope_body(response.body),
57
+ resource_class: Resources::CustomerBankAccount
58
+ )
59
+ end
60
+
61
+ # Get a lazily enumerated list of all the items returned. This is simmilar to the `list` method but will paginate for you automatically.
62
+ #
63
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
64
+ # Otherwise they will be the body of the request.
65
+ def all(options = {})
66
+ Paginator.new(
67
+ service: self,
68
+ path: '/customer_bank_accounts',
69
+ options: options
70
+ ).enumerator
71
+ end
72
+
73
+ # Retrieves the details of an existing bank account.
74
+ # Example URL: /customer_bank_accounts/:identity
75
+ #
76
+ # @param identity # Unique identifier, beginning with "BA"
77
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
78
+ # Else, they will be the body of the request.
79
+ def get(identity, options = {}, custom_headers = {})
80
+ path = sub_url('/customer_bank_accounts/:identity', 'identity' => identity)
81
+
82
+ response = make_request(:get, path, options, custom_headers)
83
+
84
+ Resources::CustomerBankAccount.new(unenvelope_body(response.body))
85
+ end
86
+
87
+ # Updates a customer bank account object. Only the metadata parameter is
88
+ # allowed.
89
+ # Example URL: /customer_bank_accounts/:identity
90
+ #
91
+ # @param identity # Unique identifier, beginning with "BA"
92
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
93
+ # Else, they will be the body of the request.
94
+ def update(identity, options = {}, custom_headers = {})
95
+ path = sub_url('/customer_bank_accounts/:identity', 'identity' => identity)
96
+
97
+ new_options = {}
98
+ new_options[envelope_key] = options
99
+ options = new_options
100
+ response = make_request(:put, path, options, custom_headers)
101
+
102
+ Resources::CustomerBankAccount.new(unenvelope_body(response.body))
103
+ end
104
+
105
+ # Immediately cancels all associated mandates and cancellable payments.
106
+ #
107
+ #
108
+ # This will return a `disable_failed` error if the bank account has already been
109
+ # disabled.
110
+ #
111
+ # A disabled bank account can be re-enabled by creating a new
112
+ # bank account resource with the same details.
113
+ # Example URL: /customer_bank_accounts/:identity/actions/disable
114
+ #
115
+ # @param identity # Unique identifier, beginning with "BA"
116
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
117
+ # Else, they will be the body of the request.
118
+ def disable(identity, options = {}, custom_headers = {})
119
+ path = sub_url('/customer_bank_accounts/:identity/actions/disable', 'identity' => identity)
120
+
121
+ new_options = {}
122
+ new_options['data'] = options
123
+ options = new_options
124
+ response = make_request(:post, path, options, custom_headers)
125
+
126
+ Resources::CustomerBankAccount.new(unenvelope_body(response.body))
127
+ end
128
+
129
+ # Unenvelope the response of the body using the service's `envelope_key`
130
+ #
131
+ # @param body [Hash]
132
+ def unenvelope_body(body)
133
+ body[envelope_key] || body['data']
134
+ end
135
+
136
+ private
137
+
138
+ # return the key which API responses will envelope data under
139
+ def envelope_key
140
+ 'customer_bank_accounts'
141
+ end
142
+
143
+ # take a URL with placeholder params and substitute them out for the acutal value
144
+ # @param url [String] the URL with placeholders in
145
+ # @param param_map [Hash] a hash of placeholders and their actual values
146
+ def sub_url(url, param_map)
147
+ param_map.reduce(url) do |new_url, (param, value)|
148
+ new_url.gsub(":#{param}", value)
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,112 @@
1
+ require_relative './base_service'
2
+
3
+ # encoding: utf-8
4
+ #
5
+ # WARNING: Do not edit by hand, this file was generated by Crank:
6
+ #
7
+ # https://github.com/gocardless/crank
8
+
9
+ module GoCardless
10
+ module Services
11
+ # Service for making requests to the Customer endpoints
12
+ class CustomerService < BaseService
13
+ # Creates a new customer object.
14
+ # Example URL: /customers
15
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
16
+ # Else, they will be the body of the request.
17
+ def create(options = {}, custom_headers = {})
18
+ path = '/customers'
19
+ new_options = {}
20
+ new_options[envelope_key] = options
21
+ options = new_options
22
+ response = make_request(:post, path, options, custom_headers)
23
+
24
+ Resources::Customer.new(unenvelope_body(response.body))
25
+ end
26
+
27
+ # Returns a
28
+ # [cursor-paginated](https://developer.gocardless.com/pro/#overview-cursor-pagination)
29
+ # list of your customers.
30
+ # Example URL: /customers
31
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
32
+ # Else, they will be the body of the request.
33
+ def list(options = {}, custom_headers = {})
34
+ path = '/customers'
35
+
36
+ response = make_request(:get, path, options, custom_headers)
37
+ ListResponse.new(
38
+ raw_response: response,
39
+ unenveloped_body: unenvelope_body(response.body),
40
+ resource_class: Resources::Customer
41
+ )
42
+ end
43
+
44
+ # Get a lazily enumerated list of all the items returned. This is simmilar to the `list` method but will paginate for you automatically.
45
+ #
46
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
47
+ # Otherwise they will be the body of the request.
48
+ def all(options = {})
49
+ Paginator.new(
50
+ service: self,
51
+ path: '/customers',
52
+ options: options
53
+ ).enumerator
54
+ end
55
+
56
+ # Retrieves the details of an existing customer.
57
+ # Example URL: /customers/:identity
58
+ #
59
+ # @param identity # Unique identifier, beginning with "CU".
60
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
61
+ # Else, they will be the body of the request.
62
+ def get(identity, options = {}, custom_headers = {})
63
+ path = sub_url('/customers/:identity', 'identity' => identity)
64
+
65
+ response = make_request(:get, path, options, custom_headers)
66
+
67
+ Resources::Customer.new(unenvelope_body(response.body))
68
+ end
69
+
70
+ # Updates a customer object. Supports all of the fields supported when creating
71
+ # a customer.
72
+ # Example URL: /customers/:identity
73
+ #
74
+ # @param identity # Unique identifier, beginning with "CU".
75
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
76
+ # Else, they will be the body of the request.
77
+ def update(identity, options = {}, custom_headers = {})
78
+ path = sub_url('/customers/:identity', 'identity' => identity)
79
+
80
+ new_options = {}
81
+ new_options[envelope_key] = options
82
+ options = new_options
83
+ response = make_request(:put, path, options, custom_headers)
84
+
85
+ Resources::Customer.new(unenvelope_body(response.body))
86
+ end
87
+
88
+ # Unenvelope the response of the body using the service's `envelope_key`
89
+ #
90
+ # @param body [Hash]
91
+ def unenvelope_body(body)
92
+ body[envelope_key] || body['data']
93
+ end
94
+
95
+ private
96
+
97
+ # return the key which API responses will envelope data under
98
+ def envelope_key
99
+ 'customers'
100
+ end
101
+
102
+ # take a URL with placeholder params and substitute them out for the acutal value
103
+ # @param url [String] the URL with placeholders in
104
+ # @param param_map [Hash] a hash of placeholders and their actual values
105
+ def sub_url(url, param_map)
106
+ param_map.reduce(url) do |new_url, (param, value)|
107
+ new_url.gsub(":#{param}", value)
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,80 @@
1
+ require_relative './base_service'
2
+
3
+ # encoding: utf-8
4
+ #
5
+ # WARNING: Do not edit by hand, this file was generated by Crank:
6
+ #
7
+ # https://github.com/gocardless/crank
8
+
9
+ module GoCardless
10
+ module Services
11
+ # Service for making requests to the Event endpoints
12
+ class EventService < BaseService
13
+ # Returns a
14
+ # [cursor-paginated](https://developer.gocardless.com/pro/#overview-cursor-pagination)
15
+ # list of your events.
16
+ # Example URL: /events
17
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
18
+ # Else, they will be the body of the request.
19
+ def list(options = {}, custom_headers = {})
20
+ path = '/events'
21
+
22
+ response = make_request(:get, path, options, custom_headers)
23
+ ListResponse.new(
24
+ raw_response: response,
25
+ unenveloped_body: unenvelope_body(response.body),
26
+ resource_class: Resources::Event
27
+ )
28
+ end
29
+
30
+ # Get a lazily enumerated list of all the items returned. This is simmilar to the `list` method but will paginate for you automatically.
31
+ #
32
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
33
+ # Otherwise they will be the body of the request.
34
+ def all(options = {})
35
+ Paginator.new(
36
+ service: self,
37
+ path: '/events',
38
+ options: options
39
+ ).enumerator
40
+ end
41
+
42
+ # Retrieves the details of a single event.
43
+ # Example URL: /events/:identity
44
+ #
45
+ # @param identity # Unique identifier, beginning with "EV"
46
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
47
+ # Else, they will be the body of the request.
48
+ def get(identity, options = {}, custom_headers = {})
49
+ path = sub_url('/events/:identity', 'identity' => identity)
50
+
51
+ response = make_request(:get, path, options, custom_headers)
52
+
53
+ Resources::Event.new(unenvelope_body(response.body))
54
+ end
55
+
56
+ # Unenvelope the response of the body using the service's `envelope_key`
57
+ #
58
+ # @param body [Hash]
59
+ def unenvelope_body(body)
60
+ body[envelope_key] || body['data']
61
+ end
62
+
63
+ private
64
+
65
+ # return the key which API responses will envelope data under
66
+ def envelope_key
67
+ 'events'
68
+ end
69
+
70
+ # take a URL with placeholder params and substitute them out for the acutal value
71
+ # @param url [String] the URL with placeholders in
72
+ # @param param_map [Hash] a hash of placeholders and their actual values
73
+ def sub_url(url, param_map)
74
+ param_map.reduce(url) do |new_url, (param, value)|
75
+ new_url.gsub(":#{param}", value)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,97 @@
1
+ require_relative './base_service'
2
+
3
+ # encoding: utf-8
4
+ #
5
+ # WARNING: Do not edit by hand, this file was generated by Crank:
6
+ #
7
+ # https://github.com/gocardless/crank
8
+
9
+ module GoCardless
10
+ module Services
11
+ # Service for making requests to the Helper endpoints
12
+ class HelperService < BaseService
13
+ # Returns a PDF mandate form with a signature field, ready to be signed by your
14
+ # customer. May be fully or partially pre-filled.
15
+ #
16
+ # You must specify `Accept:
17
+ # application/pdf` on requests to this endpoint.
18
+ #
19
+ # Bank account details may
20
+ # either be supplied using the IBAN (international bank account number), or
21
+ # [local
22
+ # details](https://developer.gocardless.com/pro/#ui-compliance-local-bank-details).
23
+ # For more information on the different fields required in each country, please
24
+ # see the [local bank
25
+ # details](https://developer.gocardless.com/pro/#ui-compliance-local-bank-details)
26
+ # section.
27
+ #
28
+ # To generate a mandate in a foreign language, set your
29
+ # `Accept-Language` header to the relevant [ISO
30
+ # 639-1](http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes#Partial_ISO_639_table)
31
+ # language code. Currently Dutch, English, French, German, Italian, Portuguese
32
+ # and Spanish are supported.
33
+ #
34
+ # _Note:_ If you want to render a PDF of an
35
+ # existing mandate you can also do so using the [mandate show
36
+ # endpoint](https://developer.gocardless.com/pro/#mandates-get-a-single-mandate).
37
+ # Example URL: /helpers/mandate
38
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
39
+ # Else, they will be the body of the request.
40
+ def mandate(options = {}, custom_headers = {})
41
+ path = '/helpers/mandate'
42
+ new_options = {}
43
+ new_options['data'] = options
44
+ options = new_options
45
+ response = make_request(:post, path, options, custom_headers)
46
+
47
+ Resources::Helper.new(unenvelope_body(response.body))
48
+ end
49
+
50
+ # Check whether an account number and bank / branch code combination are
51
+ # compatible.
52
+ #
53
+ # Bank account details may either be supplied using the IBAN
54
+ # (international bank account number), or [local
55
+ # details](https://developer.gocardless.com/pro/#ui-compliance-local-bank-details).
56
+ # For more information on the different fields required in each country, please
57
+ # see the [local bank
58
+ # details](https://developer.gocardless.com/pro/#ui-compliance-local-bank-details)
59
+ # section.
60
+ # Example URL: /helpers/modulus_check
61
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
62
+ # Else, they will be the body of the request.
63
+ def modulus_check(options = {}, custom_headers = {})
64
+ path = '/helpers/modulus_check'
65
+ new_options = {}
66
+ new_options['data'] = options
67
+ options = new_options
68
+ response = make_request(:post, path, options, custom_headers)
69
+
70
+ Resources::Helper.new(unenvelope_body(response.body))
71
+ end
72
+
73
+ # Unenvelope the response of the body using the service's `envelope_key`
74
+ #
75
+ # @param body [Hash]
76
+ def unenvelope_body(body)
77
+ body[envelope_key] || body['data']
78
+ end
79
+
80
+ private
81
+
82
+ # return the key which API responses will envelope data under
83
+ def envelope_key
84
+ 'helpers'
85
+ end
86
+
87
+ # take a URL with placeholder params and substitute them out for the acutal value
88
+ # @param url [String] the URL with placeholders in
89
+ # @param param_map [Hash] a hash of placeholders and their actual values
90
+ def sub_url(url, param_map)
91
+ param_map.reduce(url) do |new_url, (param, value)|
92
+ new_url.gsub(":#{param}", value)
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,170 @@
1
+ require_relative './base_service'
2
+
3
+ # encoding: utf-8
4
+ #
5
+ # WARNING: Do not edit by hand, this file was generated by Crank:
6
+ #
7
+ # https://github.com/gocardless/crank
8
+
9
+ module GoCardless
10
+ module Services
11
+ # Service for making requests to the Mandate endpoints
12
+ class MandateService < BaseService
13
+ # Creates a new mandate object
14
+ # Example URL: /mandates
15
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
16
+ # Else, they will be the body of the request.
17
+ def create(options = {}, custom_headers = {})
18
+ path = '/mandates'
19
+ new_options = {}
20
+ new_options[envelope_key] = options
21
+ options = new_options
22
+ response = make_request(:post, path, options, custom_headers)
23
+
24
+ Resources::Mandate.new(unenvelope_body(response.body))
25
+ end
26
+
27
+ # Returns a
28
+ # [cursor-paginated](https://developer.gocardless.com/pro/#overview-cursor-pagination)
29
+ # list of your mandates. Except where stated, these filters can only be used one
30
+ # at a time.
31
+ # Example URL: /mandates
32
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
33
+ # Else, they will be the body of the request.
34
+ def list(options = {}, custom_headers = {})
35
+ path = '/mandates'
36
+
37
+ response = make_request(:get, path, options, custom_headers)
38
+ ListResponse.new(
39
+ raw_response: response,
40
+ unenveloped_body: unenvelope_body(response.body),
41
+ resource_class: Resources::Mandate
42
+ )
43
+ end
44
+
45
+ # Get a lazily enumerated list of all the items returned. This is simmilar to the `list` method but will paginate for you automatically.
46
+ #
47
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
48
+ # Otherwise they will be the body of the request.
49
+ def all(options = {})
50
+ Paginator.new(
51
+ service: self,
52
+ path: '/mandates',
53
+ options: options
54
+ ).enumerator
55
+ end
56
+
57
+ # Retrieves the details of an existing mandate.
58
+ #
59
+ # If you specify `Accept:
60
+ # application/pdf` on a request to this endpoint it will return a PDF complying
61
+ # to the relevant scheme rules, which you can present to your customer.
62
+ #
63
+ # PDF
64
+ # mandates can be retrieved in Dutch, English, French, German, Italian,
65
+ # Portuguese and Spanish by specifying the [ISO
66
+ # 639-1](http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes#Partial_ISO_639_table)
67
+ # language code as an `Accept-Language` header.
68
+ # Example URL: /mandates/:identity
69
+ #
70
+ # @param identity # Unique identifier, beginning with "MD"
71
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
72
+ # Else, they will be the body of the request.
73
+ def get(identity, options = {}, custom_headers = {})
74
+ path = sub_url('/mandates/:identity', 'identity' => identity)
75
+
76
+ response = make_request(:get, path, options, custom_headers)
77
+
78
+ Resources::Mandate.new(unenvelope_body(response.body))
79
+ end
80
+
81
+ # Updates a mandate object. This accepts only the metadata parameter.
82
+ # Example URL: /mandates/:identity
83
+ #
84
+ # @param identity # Unique identifier, beginning with "MD"
85
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
86
+ # Else, they will be the body of the request.
87
+ def update(identity, options = {}, custom_headers = {})
88
+ path = sub_url('/mandates/:identity', 'identity' => identity)
89
+
90
+ new_options = {}
91
+ new_options[envelope_key] = options
92
+ options = new_options
93
+ response = make_request(:put, path, options, custom_headers)
94
+
95
+ Resources::Mandate.new(unenvelope_body(response.body))
96
+ end
97
+
98
+ # Immediately cancels a mandate and all associated cancellable payments. Any
99
+ # metadata supplied to this endpoint will be stored on the mandate cancellation
100
+ # event it causes.
101
+ #
102
+ # This will fail with a `cancellation_failed` error if the
103
+ # mandate is already cancelled.
104
+ # Example URL: /mandates/:identity/actions/cancel
105
+ #
106
+ # @param identity # Unique identifier, beginning with "MD"
107
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
108
+ # Else, they will be the body of the request.
109
+ def cancel(identity, options = {}, custom_headers = {})
110
+ path = sub_url('/mandates/:identity/actions/cancel', 'identity' => identity)
111
+
112
+ new_options = {}
113
+ new_options['data'] = options
114
+ options = new_options
115
+ response = make_request(:post, path, options, custom_headers)
116
+
117
+ Resources::Mandate.new(unenvelope_body(response.body))
118
+ end
119
+
120
+ # <a name="mandate_not_inactive"></a>Reinstates a cancelled or expired mandate
121
+ # to the banks. You will receive a `resubmission_requested` webhook, but after
122
+ # that reinstating the mandate follows the same process as its initial creation,
123
+ # so you will receive a `submitted` webhook, followed by a `reinstated` or
124
+ # `failed` webhook up to two working days later. Any metadata supplied to this
125
+ # endpoint will be stored on the `resubmission_requested` event it causes.
126
+ #
127
+ #
128
+ # This will fail with a `mandate_not_inactive` error if the mandate is already
129
+ # being submitted, or is active.
130
+ # Example URL: /mandates/:identity/actions/reinstate
131
+ #
132
+ # @param identity # Unique identifier, beginning with "MD"
133
+ # @param options [Hash] parameters as a hash. If the request is a GET, these will be converted to query parameters.
134
+ # Else, they will be the body of the request.
135
+ def reinstate(identity, options = {}, custom_headers = {})
136
+ path = sub_url('/mandates/:identity/actions/reinstate', 'identity' => identity)
137
+
138
+ new_options = {}
139
+ new_options['data'] = options
140
+ options = new_options
141
+ response = make_request(:post, path, options, custom_headers)
142
+
143
+ Resources::Mandate.new(unenvelope_body(response.body))
144
+ end
145
+
146
+ # Unenvelope the response of the body using the service's `envelope_key`
147
+ #
148
+ # @param body [Hash]
149
+ def unenvelope_body(body)
150
+ body[envelope_key] || body['data']
151
+ end
152
+
153
+ private
154
+
155
+ # return the key which API responses will envelope data under
156
+ def envelope_key
157
+ 'mandates'
158
+ end
159
+
160
+ # take a URL with placeholder params and substitute them out for the acutal value
161
+ # @param url [String] the URL with placeholders in
162
+ # @param param_map [Hash] a hash of placeholders and their actual values
163
+ def sub_url(url, param_map)
164
+ param_map.reduce(url) do |new_url, (param, value)|
165
+ new_url.gsub(":#{param}", value)
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end