recurly 3.3.1 → 3.7.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.
- checksums.yaml +4 -4
- data/.bumpversion.cfg +5 -1
- data/.github/workflows/docs.yml +28 -0
- data/.travis.yml +1 -0
- data/CHANGELOG.md +92 -1
- data/GETTING_STARTED.md +61 -1
- data/README.md +1 -1
- data/lib/data/ca-certificates.crt +3464 -29
- data/lib/recurly.rb +1 -0
- data/lib/recurly/client.rb +217 -111
- data/lib/recurly/client/operations.rb +301 -1
- data/lib/recurly/connection_pool.rb +40 -0
- data/lib/recurly/errors.rb +30 -0
- data/lib/recurly/errors/network_errors.rb +2 -0
- data/lib/recurly/http.rb +13 -8
- data/lib/recurly/pager.rb +31 -12
- data/lib/recurly/requests/add_on_create.rb +15 -3
- data/lib/recurly/requests/add_on_update.rb +9 -1
- data/lib/recurly/requests/billing_info_create.rb +26 -2
- data/lib/recurly/requests/external_transaction.rb +26 -0
- data/lib/recurly/requests/plan_create.rb +8 -0
- data/lib/recurly/requests/plan_update.rb +8 -0
- data/lib/recurly/requests/shipping_method_create.rb +26 -0
- data/lib/recurly/requests/shipping_method_update.rb +26 -0
- data/lib/recurly/requests/subscription_add_on_create.rb +5 -1
- data/lib/recurly/requests/subscription_add_on_tier.rb +18 -0
- data/lib/recurly/requests/subscription_add_on_update.rb +6 -2
- data/lib/recurly/requests/subscription_change_create.rb +1 -1
- data/lib/recurly/requests/tier.rb +18 -0
- data/lib/recurly/resources/add_on.rb +8 -0
- data/lib/recurly/resources/line_item.rb +1 -1
- data/lib/recurly/resources/payment_method.rb +4 -0
- data/lib/recurly/resources/plan.rb +8 -0
- data/lib/recurly/resources/shipping_method.rb +4 -0
- data/lib/recurly/resources/subscription_add_on.rb +12 -0
- data/lib/recurly/resources/subscription_add_on_tier.rb +18 -0
- data/lib/recurly/resources/tier.rb +18 -0
- data/lib/recurly/resources/transaction.rb +4 -0
- data/lib/recurly/version.rb +1 -1
- data/openapi/api.yaml +5325 -2782
- data/recurly.gemspec +8 -3
- data/scripts/changelog +2 -0
- data/scripts/format +5 -1
- data/scripts/release +5 -3
- metadata +17 -38
- data/lib/recurly/client/adapter.rb +0 -39
data/lib/recurly.rb
CHANGED
data/lib/recurly/client.rb
CHANGED
@@ -1,18 +1,26 @@
|
|
1
|
-
require "faraday"
|
2
1
|
require "logger"
|
3
2
|
require "erb"
|
3
|
+
require "net/https"
|
4
|
+
require "base64"
|
5
|
+
require "securerandom"
|
4
6
|
require_relative "./schema/json_parser"
|
5
7
|
require_relative "./schema/file_parser"
|
6
|
-
require_relative "./client/adapter"
|
7
8
|
|
8
9
|
module Recurly
|
9
10
|
class Client
|
10
11
|
require_relative "./client/operations"
|
11
12
|
|
12
|
-
|
13
|
+
BASE_HOST = "v3.recurly.com"
|
14
|
+
BASE_PORT = 443
|
15
|
+
CA_FILE = File.join(File.dirname(__FILE__), "../data/ca-certificates.crt")
|
13
16
|
BINARY_TYPES = [
|
14
17
|
"application/pdf",
|
15
|
-
]
|
18
|
+
].freeze
|
19
|
+
JSON_CONTENT_TYPE = "application/json"
|
20
|
+
MAX_RETRIES = 3
|
21
|
+
LOG_LEVELS = %i(debug info warn error fatal).freeze
|
22
|
+
BASE36_ALPHABET = (("0".."9").to_a + ("a".."z").to_a).freeze
|
23
|
+
REQUEST_OPTIONS = [:headers].freeze
|
16
24
|
|
17
25
|
# Initialize a client. It requires an API key.
|
18
26
|
#
|
@@ -38,27 +46,42 @@ module Recurly
|
|
38
46
|
# sub = client.get_subscription(subscription_id: 'uuid-abcd7890')
|
39
47
|
#
|
40
48
|
# @param api_key [String] The private API key
|
41
|
-
# @param
|
42
|
-
|
43
|
-
def initialize(api_key:, site_id: nil, subdomain: nil, **options)
|
49
|
+
# @param logger [Logger] A logger to use. Defaults to creating a new STDOUT logger with level WARN.
|
50
|
+
def initialize(api_key:, site_id: nil, subdomain: nil, logger: nil)
|
44
51
|
set_site_id(site_id, subdomain)
|
45
|
-
|
46
|
-
|
52
|
+
set_api_key(api_key)
|
53
|
+
|
54
|
+
if logger.nil?
|
55
|
+
@logger = Logger.new(STDOUT).tap do |l|
|
56
|
+
l.level = Logger::WARN
|
57
|
+
end
|
58
|
+
else
|
59
|
+
unless LOG_LEVELS.all? { |lev| logger.respond_to?(lev) }
|
60
|
+
raise ArgumentError, "You must pass in a logger implementation that responds to the following messages: #{LOG_LEVELS}"
|
61
|
+
end
|
62
|
+
@logger = logger
|
63
|
+
end
|
64
|
+
|
65
|
+
if @logger.level < Logger::INFO
|
66
|
+
msg = <<-MSG
|
67
|
+
The Recurly logger should not be initialized
|
68
|
+
beyond the level INFO. It is currently configured to emit
|
69
|
+
headers and request / response bodies. This has the potential to leak
|
70
|
+
PII and other sensitive information and should never be used in production.
|
71
|
+
MSG
|
72
|
+
log_warn("SECURITY_WARNING", message: msg)
|
73
|
+
end
|
47
74
|
|
48
75
|
# execute block with this client if given
|
49
76
|
yield(self) if block_given?
|
50
77
|
end
|
51
78
|
|
52
|
-
def next_page(pager)
|
53
|
-
req = HTTP::Request.new(:get, pager.next, nil)
|
54
|
-
faraday_resp = run_request(req, headers)
|
55
|
-
handle_response! req, faraday_resp
|
56
|
-
end
|
57
|
-
|
58
79
|
protected
|
59
80
|
|
81
|
+
# Used by the operations.rb file to interpolate paths
|
82
|
+
attr_reader :site_id
|
83
|
+
|
60
84
|
def pager(path, **options)
|
61
|
-
path = scope_by_site(path, **options)
|
62
85
|
Pager.new(
|
63
86
|
client: self,
|
64
87
|
path: path,
|
@@ -66,70 +89,158 @@ module Recurly
|
|
66
89
|
)
|
67
90
|
end
|
68
91
|
|
92
|
+
def head(path, **options)
|
93
|
+
request = Net::HTTP::Head.new build_url(path, options)
|
94
|
+
set_headers(request, options[:headers])
|
95
|
+
http_response = run_request(request, options)
|
96
|
+
handle_response! request, http_response
|
97
|
+
end
|
98
|
+
|
69
99
|
def get(path, **options)
|
70
|
-
|
71
|
-
request
|
72
|
-
|
73
|
-
handle_response! request,
|
74
|
-
rescue Faraday::ClientError => ex
|
75
|
-
raise_network_error!(ex)
|
100
|
+
request = Net::HTTP::Get.new build_url(path, options)
|
101
|
+
set_headers(request, options[:headers])
|
102
|
+
http_response = run_request(request, options)
|
103
|
+
handle_response! request, http_response
|
76
104
|
end
|
77
105
|
|
78
106
|
def post(path, request_data, request_class, **options)
|
79
107
|
request_class.new(request_data).validate!
|
80
|
-
|
81
|
-
request
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
108
|
+
request = Net::HTTP::Post.new build_url(path, options)
|
109
|
+
request.set_content_type(JSON_CONTENT_TYPE)
|
110
|
+
set_headers(request, options[:headers])
|
111
|
+
request.body = JSON.dump(request_data)
|
112
|
+
http_response = run_request(request, options)
|
113
|
+
handle_response! request, http_response
|
86
114
|
end
|
87
115
|
|
88
116
|
def put(path, request_data = nil, request_class = nil, **options)
|
89
|
-
|
90
|
-
request
|
117
|
+
request = Net::HTTP::Put.new build_url(path, options)
|
118
|
+
request.set_content_type(JSON_CONTENT_TYPE)
|
119
|
+
set_headers(request, options[:headers])
|
91
120
|
if request_data
|
92
121
|
request_class.new(request_data).validate!
|
93
|
-
|
94
|
-
request.body =
|
122
|
+
json_body = JSON.dump(request_data)
|
123
|
+
request.body = json_body
|
95
124
|
end
|
96
|
-
|
97
|
-
handle_response! request,
|
98
|
-
rescue Faraday::ClientError => ex
|
99
|
-
raise_network_error!(ex)
|
125
|
+
http_response = run_request(request, options)
|
126
|
+
handle_response! request, http_response
|
100
127
|
end
|
101
128
|
|
102
129
|
def delete(path, **options)
|
103
|
-
|
104
|
-
request
|
105
|
-
|
106
|
-
handle_response! request,
|
107
|
-
rescue Faraday::ClientError => ex
|
108
|
-
raise_network_error!(ex)
|
130
|
+
request = Net::HTTP::Delete.new build_url(path, options)
|
131
|
+
set_headers(request, options[:headers])
|
132
|
+
http_response = run_request(request, options)
|
133
|
+
handle_response! request, http_response
|
109
134
|
end
|
110
135
|
|
111
|
-
|
136
|
+
private
|
112
137
|
|
113
|
-
|
114
|
-
attr_reader :site_id
|
138
|
+
@connection_pool = Recurly::ConnectionPool.new
|
115
139
|
|
116
|
-
|
140
|
+
class << self
|
141
|
+
# @return [Recurly::ConnectionPool]
|
142
|
+
attr_accessor :connection_pool
|
143
|
+
end
|
144
|
+
|
145
|
+
def run_request(request, options = {})
|
146
|
+
self.class.connection_pool.with_connection do |http|
|
147
|
+
set_http_options(http, options)
|
148
|
+
|
149
|
+
retries = 0
|
150
|
+
|
151
|
+
begin
|
152
|
+
http.start unless http.started?
|
153
|
+
log_attrs = {
|
154
|
+
method: request.method,
|
155
|
+
path: request.path,
|
156
|
+
}
|
157
|
+
if @logger.level < Logger::INFO
|
158
|
+
log_attrs[:request_body] = request.body
|
159
|
+
# No need to log the authorization header
|
160
|
+
headers = request.to_hash.reject { |k, _| k&.downcase == "authorization" }
|
161
|
+
log_attrs[:request_headers] = headers
|
162
|
+
end
|
163
|
+
|
164
|
+
log_info("Request", **log_attrs)
|
165
|
+
start = Time.now
|
166
|
+
response = http.request(request)
|
167
|
+
elapsed = Time.now - start
|
168
|
+
|
169
|
+
# GETs are safe to retry after a server error, requests with an Idempotency-Key will return the prior response
|
170
|
+
if response.kind_of?(Net::HTTPServerError) && request.is_a?(Net::HTTP::Get)
|
171
|
+
retries += 1
|
172
|
+
log_info("Retrying", retries: retries, **log_attrs)
|
173
|
+
start = Time.now
|
174
|
+
response = http.request(request) if retries < MAX_RETRIES
|
175
|
+
elapsed = Time.now - start
|
176
|
+
end
|
177
|
+
|
178
|
+
if @logger.level < Logger::INFO
|
179
|
+
log_attrs[:response_body] = response.body
|
180
|
+
log_attrs[:response_headers] = response.to_hash
|
181
|
+
end
|
182
|
+
log_info("Response", time_ms: (elapsed * 1_000).floor, status: response.code, **log_attrs)
|
183
|
+
|
184
|
+
response
|
185
|
+
rescue Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::EHOSTUNREACH, Errno::ECONNABORTED,
|
186
|
+
Errno::EPIPE, Errno::ETIMEDOUT, Net::OpenTimeout, EOFError, SocketError => ex
|
187
|
+
retries += 1
|
188
|
+
if retries < MAX_RETRIES
|
189
|
+
retry
|
190
|
+
end
|
191
|
+
|
192
|
+
if ex.kind_of?(Net::OpenTimeout) || ex.kind_of?(Errno::ETIMEDOUT)
|
193
|
+
raise Recurly::Errors::TimeoutError, "Request timed out"
|
194
|
+
end
|
195
|
+
|
196
|
+
raise Recurly::Errors::ConnectionFailedError, "Failed to connect to Recurly: #{ex.message}"
|
197
|
+
rescue Net::ReadTimeout, Timeout::Error
|
198
|
+
raise Recurly::Errors::TimeoutError, "Request timed out"
|
199
|
+
rescue OpenSSL::SSL::SSLError => ex
|
200
|
+
raise Recurly::Errors::SSLError, ex.message
|
201
|
+
rescue StandardError => ex
|
202
|
+
raise Recurly::Errors::NetworkError, ex.message
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
117
206
|
|
118
|
-
|
119
|
-
|
207
|
+
def set_headers(request, additional_headers = {})
|
208
|
+
# TODO this is undocumented until we finalize it
|
209
|
+
additional_headers.each { |header, v| request[header] = v } if additional_headers
|
210
|
+
|
211
|
+
request["Accept"] = "application/vnd.recurly.#{api_version}".chomp # got this method from operations.rb
|
212
|
+
request["Authorization"] = "Basic #{Base64.encode64(@api_key)}".chomp
|
213
|
+
request["User-Agent"] = "Recurly/#{VERSION}; #{RUBY_DESCRIPTION}"
|
214
|
+
|
215
|
+
unless request.is_a?(Net::HTTP::Get) || request.is_a?(Net::HTTP::Head)
|
216
|
+
request["Idempotency-Key"] ||= generate_idempotency_key
|
217
|
+
end
|
218
|
+
end
|
120
219
|
|
121
|
-
|
122
|
-
|
220
|
+
# from https://github.com/rails/rails/blob/6-0-stable/activesupport/lib/active_support/core_ext/securerandom.rb
|
221
|
+
def generate_idempotency_key(n = 16)
|
222
|
+
SecureRandom.random_bytes(n).unpack("C*").map do |byte|
|
223
|
+
idx = byte % 64
|
224
|
+
idx = SecureRandom.random_number(36) if idx >= 36
|
225
|
+
BASE36_ALPHABET[idx]
|
226
|
+
end.join
|
123
227
|
end
|
124
228
|
|
125
|
-
def
|
126
|
-
|
127
|
-
|
229
|
+
def set_http_options(http, options)
|
230
|
+
http.open_timeout = options[:open_timeout] || 20
|
231
|
+
http.read_timeout = options[:read_timeout] || 60
|
232
|
+
end
|
233
|
+
|
234
|
+
def handle_response!(request, http_response)
|
235
|
+
response = HTTP::Response.new(http_response, request)
|
236
|
+
raise_api_error!(http_response, response) unless http_response.kind_of?(Net::HTTPSuccess)
|
128
237
|
resource = if response.body
|
129
|
-
if
|
238
|
+
if http_response.content_type&.include?(JSON_CONTENT_TYPE)
|
239
|
+
JSONParser.parse(self, response.body)
|
240
|
+
elsif BINARY_TYPES.include?(http_response.content_type)
|
130
241
|
FileParser.parse(response.body)
|
131
242
|
else
|
132
|
-
|
243
|
+
raise Recurly::Errors::InvalidResponseError, "Unexpected content type: #{http_response.content_type}"
|
133
244
|
end
|
134
245
|
else
|
135
246
|
Resources::Empty.new
|
@@ -139,46 +250,34 @@ module Recurly
|
|
139
250
|
resource
|
140
251
|
end
|
141
252
|
|
142
|
-
def
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
when Faraday::SSLError
|
149
|
-
Errors::SSLError
|
150
|
-
else
|
151
|
-
Errors::NetworkError
|
152
|
-
end
|
253
|
+
def raise_api_error!(http_response, response)
|
254
|
+
if response.content_type.include?(JSON_CONTENT_TYPE)
|
255
|
+
error = JSONParser.parse(self, response.body)
|
256
|
+
error_class = Errors::APIError.error_class(error.type)
|
257
|
+
raise error_class.new(response, error)
|
258
|
+
end
|
153
259
|
|
154
|
-
|
155
|
-
end
|
260
|
+
error_class = Errors::APIError.from_response(http_response)
|
156
261
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
262
|
+
if error_class <= Recurly::Errors::APIError
|
263
|
+
error = Recurly::Resources::Error.new(message: "#{http_response.code}: #{http_response.message}")
|
264
|
+
raise error_class.new(response, error)
|
265
|
+
else
|
266
|
+
raise error_class, "#{http_response.code}: #{http_response.message}"
|
267
|
+
end
|
161
268
|
end
|
162
269
|
|
163
270
|
def read_headers(response)
|
164
271
|
if !@_ignore_deprecation_warning && response.headers["Recurly-Deprecated"]&.upcase == "TRUE"
|
165
|
-
|
272
|
+
log_warn("DEPRECTATION WARNING", message: "Your current API version \"#{api_version}\" is deprecated and will be sunset on #{response.headers["Recurly-Sunset-Date"]}")
|
166
273
|
end
|
167
274
|
response
|
168
275
|
end
|
169
276
|
|
170
|
-
def
|
171
|
-
|
172
|
-
|
173
|
-
"Content-Type" => "application/json",
|
174
|
-
"User-Agent" => "Recurly/#{VERSION}; #{RUBY_DESCRIPTION}",
|
175
|
-
}.merge(@extra_headers)
|
176
|
-
end
|
177
|
-
|
178
|
-
def interpolate_path(path, **options)
|
277
|
+
def validate_path_parameters!(**options)
|
278
|
+
# Check to see that we are passing the correct data types
|
279
|
+
# This prevents a confusing error if the user passes in a non-primitive by mistake
|
179
280
|
options.each do |k, v|
|
180
|
-
# Check to see that we are passing the correct data types
|
181
|
-
# This prevents a confusing error if the user passes in a non-primitive by mistake
|
182
281
|
unless [String, Symbol, Integer, Float].include?(v.class)
|
183
282
|
message = "We cannot build the url with the given argument #{k}=#{v.inspect}."
|
184
283
|
if k =~ /_id$/
|
@@ -186,6 +285,17 @@ module Recurly
|
|
186
285
|
end
|
187
286
|
raise ArgumentError, message
|
188
287
|
end
|
288
|
+
end
|
289
|
+
# Check to make sure that parameters are not empty string values
|
290
|
+
empty_strings = options.select { |_, v| v.is_a?(String) && v.strip.empty? }
|
291
|
+
if empty_strings.any?
|
292
|
+
raise ArgumentError, "#{empty_strings.keys.join(", ")} cannot be an empty string"
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
def interpolate_path(path, **options)
|
297
|
+
validate_path_parameters!(options)
|
298
|
+
options.each do |k, v|
|
189
299
|
# We need to encode the values for the url
|
190
300
|
options[k] = ERB::Util.url_encode(v.to_s)
|
191
301
|
end
|
@@ -201,42 +311,38 @@ module Recurly
|
|
201
311
|
end
|
202
312
|
end
|
203
313
|
|
204
|
-
def
|
205
|
-
|
206
|
-
|
314
|
+
def set_api_key(api_key)
|
315
|
+
@api_key = api_key
|
316
|
+
end
|
317
|
+
|
318
|
+
def build_url(path, options)
|
319
|
+
path = scope_by_site(path, options)
|
320
|
+
query_params = options.reject { |k, _| REQUEST_OPTIONS.include?(k.to_sym) }
|
321
|
+
if query_params.any?
|
322
|
+
"#{path}?#{URI.encode_www_form(query_params)}"
|
207
323
|
else
|
208
324
|
path
|
209
325
|
end
|
210
326
|
end
|
211
327
|
|
212
|
-
def
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
# but we will use these certs for any other staging or dev environment
|
220
|
-
unless BASE_URL.end_with?(".recurly.com")
|
221
|
-
options[:ssl][:ca_file] = File.join(File.dirname(__FILE__), "../data/ca-certificates.crt")
|
328
|
+
def scope_by_site(path, **options)
|
329
|
+
if site = site_id || options[:site_id]
|
330
|
+
# Ensure that we are only including the site_id once because the Pager operations
|
331
|
+
# will use the cursor returned from the API which may already have these components
|
332
|
+
path.start_with?("/sites/#{site}") ? path : "/sites/#{site}#{path}"
|
333
|
+
else
|
334
|
+
path
|
222
335
|
end
|
336
|
+
end
|
223
337
|
|
224
|
-
|
225
|
-
|
226
|
-
|
338
|
+
# Define a private `log_<level>` method for each log level
|
339
|
+
LOG_LEVELS.each do |level|
|
340
|
+
define_method "log_#{level}" do |tag, **attrs|
|
341
|
+
@logger.send(level, "Recurly") do
|
342
|
+
msg = attrs.each_pair.map { |k, v| "#{k}=#{v.inspect}" }.join(" ")
|
343
|
+
"[#{tag}] #{msg}"
|
227
344
|
end
|
228
|
-
faraday.basic_auth(api_key, "")
|
229
|
-
configure_net_adapter(faraday)
|
230
345
|
end
|
231
346
|
end
|
232
|
-
|
233
|
-
def set_options(options)
|
234
|
-
@log_level = options[:log_level] || Logger::WARN
|
235
|
-
@logger = Logger.new(STDOUT)
|
236
|
-
@logger.level = @log_level
|
237
|
-
|
238
|
-
# TODO this is undocumented until we finalize it
|
239
|
-
@extra_headers = options[:headers] || {}
|
240
|
-
end
|
241
347
|
end
|
242
348
|
end
|
@@ -30,6 +30,7 @@ module Recurly
|
|
30
30
|
# order. In descending order updated records will move behind the cursor and could
|
31
31
|
# prevent some records from being returned.
|
32
32
|
#
|
33
|
+
# @param state [String] Filter by state.
|
33
34
|
# @return [Pager<Resources::Site>] A list of sites.
|
34
35
|
# @example
|
35
36
|
# sites = @client.list_sites(limit: 200)
|
@@ -48,6 +49,16 @@ module Recurly
|
|
48
49
|
#
|
49
50
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
50
51
|
# @return [Resources::Site] A site.
|
52
|
+
# @example
|
53
|
+
# begin
|
54
|
+
# site = @client.get_site(site_id: site_id)
|
55
|
+
# puts "Got Site #{site}"
|
56
|
+
# rescue Recurly::Errors::NotFoundError
|
57
|
+
# # If the resource was not found, you may want to alert the user or
|
58
|
+
# # just return nil
|
59
|
+
# puts "Resource Not Found"
|
60
|
+
# end
|
61
|
+
#
|
51
62
|
def get_site(site_id:)
|
52
63
|
path = interpolate_path("/sites/{site_id}", site_id: site_id)
|
53
64
|
get(path)
|
@@ -251,6 +262,28 @@ module Recurly
|
|
251
262
|
# @param body [Requests::AccountAcquisitionUpdatable] The Hash representing the JSON request to send to the server. It should conform to the schema of {Requests::AccountAcquisitionUpdatable}
|
252
263
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
253
264
|
# @return [Resources::AccountAcquisition] An account's updated acquisition data.
|
265
|
+
# @example
|
266
|
+
# begin
|
267
|
+
# acquisition_update = {
|
268
|
+
# campaign: "podcast-marketing",
|
269
|
+
# channel: "social_media",
|
270
|
+
# subchannel: "twitter",
|
271
|
+
# cost: {
|
272
|
+
# currency: "USD",
|
273
|
+
# amount: 0.50
|
274
|
+
# }
|
275
|
+
# }
|
276
|
+
# acquisition = @client.update_account_acquisition(
|
277
|
+
# account_id: account_id,
|
278
|
+
# body: acquisition_update
|
279
|
+
# )
|
280
|
+
# puts "Updated AccountAcqusition #{acquisition}"
|
281
|
+
# rescue Recurly::Errors::ValidationError => e
|
282
|
+
# # If the request was invalid, you may want to tell your user
|
283
|
+
# # why. You can find the invalid params and reasons in e.recurly_error.params
|
284
|
+
# puts "ValidationError: #{e.recurly_error.params}"
|
285
|
+
# end
|
286
|
+
#
|
254
287
|
def update_account_acquisition(account_id:, body:, **options)
|
255
288
|
path = interpolate_path("/accounts/{account_id}/acquisition", account_id: account_id)
|
256
289
|
put(path, body, Requests::AccountAcquisitionUpdatable, **options)
|
@@ -845,6 +878,26 @@ module Recurly
|
|
845
878
|
# @param body [Requests::ShippingAddressCreate] The Hash representing the JSON request to send to the server. It should conform to the schema of {Requests::ShippingAddressCreate}
|
846
879
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
847
880
|
# @return [Resources::ShippingAddress] Returns the new shipping address.
|
881
|
+
# @example
|
882
|
+
# begin
|
883
|
+
# shipping_address_create = {
|
884
|
+
# nickname: 'Work',
|
885
|
+
# street1: '900 Camp St',
|
886
|
+
# city: 'New Orleans',
|
887
|
+
# region: 'LA',
|
888
|
+
# country: 'US',
|
889
|
+
# postal_code: '70115',
|
890
|
+
# first_name: 'Joanna',
|
891
|
+
# last_name: 'Du Monde'
|
892
|
+
# }
|
893
|
+
# shipping_address = @client.create_shipping_address(account_id: account_id, body: shipping_address_create)
|
894
|
+
# puts "Created Shipping Address #{shipping_address}"
|
895
|
+
# rescue Recurly::Errors::NotFoundError
|
896
|
+
# # If the resource was not found, you may want to alert the user or
|
897
|
+
# # just return nil
|
898
|
+
# puts "Resource Not Found"
|
899
|
+
# end
|
900
|
+
#
|
848
901
|
def create_shipping_address(account_id:, body:, **options)
|
849
902
|
path = interpolate_path("/accounts/{account_id}/shipping_addresses", account_id: account_id)
|
850
903
|
post(path, body, Requests::ShippingAddressCreate, **options)
|
@@ -1230,11 +1283,46 @@ module Recurly
|
|
1230
1283
|
# @param body [Requests::CouponUpdate] The Hash representing the JSON request to send to the server. It should conform to the schema of {Requests::CouponUpdate}
|
1231
1284
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
1232
1285
|
# @return [Resources::Coupon] The updated coupon.
|
1286
|
+
# @example
|
1287
|
+
# begin
|
1288
|
+
# coupon_update = {
|
1289
|
+
# name: "New Coupon Name"
|
1290
|
+
# }
|
1291
|
+
# coupon = @client.update_coupon(coupon_id: coupon_id, body: coupon_update)
|
1292
|
+
# puts "Updated Coupon #{coupon}"
|
1293
|
+
# rescue Recurly::Errors::NotFoundError
|
1294
|
+
# # If the resource was not found, you may want to alert the user or
|
1295
|
+
# # just return nil
|
1296
|
+
# puts "Resource Not Found"
|
1297
|
+
# end
|
1298
|
+
#
|
1233
1299
|
def update_coupon(coupon_id:, body:, **options)
|
1234
1300
|
path = interpolate_path("/coupons/{coupon_id}", coupon_id: coupon_id)
|
1235
1301
|
put(path, body, Requests::CouponUpdate, **options)
|
1236
1302
|
end
|
1237
1303
|
|
1304
|
+
# Expire a coupon
|
1305
|
+
#
|
1306
|
+
# {https://developers.recurly.com/api/v2019-10-10#operation/deactivate_coupon deactivate_coupon api documenation}
|
1307
|
+
#
|
1308
|
+
# @param coupon_id [String] Coupon ID or code. For ID no prefix is used e.g. +e28zov4fw0v2+. For code use prefix +code-+, e.g. +code-10off+.
|
1309
|
+
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
1310
|
+
# @return [Resources::Coupon] The expired Coupon
|
1311
|
+
# @example
|
1312
|
+
# begin
|
1313
|
+
# coupon = @client.deactivate_coupon(coupon_id: coupon_id)
|
1314
|
+
# puts "Deactivated Coupon #{coupon}"
|
1315
|
+
# rescue Recurly::Errors::NotFoundError
|
1316
|
+
# # If the resource was not found, you may want to alert the user or
|
1317
|
+
# # just return nil
|
1318
|
+
# puts "Resource Not Found"
|
1319
|
+
# end
|
1320
|
+
#
|
1321
|
+
def deactivate_coupon(coupon_id:, **options)
|
1322
|
+
path = interpolate_path("/coupons/{coupon_id}", coupon_id: coupon_id)
|
1323
|
+
delete(path, **options)
|
1324
|
+
end
|
1325
|
+
|
1238
1326
|
# List unique coupon codes associated with a bulk coupon
|
1239
1327
|
#
|
1240
1328
|
# {https://developers.recurly.com/api/v2019-10-10#operation/list_unique_coupon_codes list_unique_coupon_codes api documenation}
|
@@ -1361,6 +1449,18 @@ module Recurly
|
|
1361
1449
|
# @param custom_field_definition_id [String] Custom Field Definition ID
|
1362
1450
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
1363
1451
|
# @return [Resources::CustomFieldDefinition] An custom field definition.
|
1452
|
+
# @example
|
1453
|
+
# begin
|
1454
|
+
# custom_field_definition = @client.get_custom_field_definition(
|
1455
|
+
# custom_field_definition_id: custom_field_definition_id
|
1456
|
+
# )
|
1457
|
+
# puts "Got Custom Field Definition #{custom_field_definition}"
|
1458
|
+
# rescue Recurly::Errors::NotFoundError
|
1459
|
+
# # If the resource was not found, you may want to alert the user or
|
1460
|
+
# # just return nil
|
1461
|
+
# puts "Resource Not Found"
|
1462
|
+
# end
|
1463
|
+
#
|
1364
1464
|
def get_custom_field_definition(custom_field_definition_id:, **options)
|
1365
1465
|
path = interpolate_path("/custom_field_definitions/{custom_field_definition_id}", custom_field_definition_id: custom_field_definition_id)
|
1366
1466
|
get(path, **options)
|
@@ -1615,6 +1715,20 @@ module Recurly
|
|
1615
1715
|
# @param body [Requests::InvoiceUpdatable] The Hash representing the JSON request to send to the server. It should conform to the schema of {Requests::InvoiceUpdatable}
|
1616
1716
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
1617
1717
|
# @return [Resources::Invoice] An invoice.
|
1718
|
+
# @example
|
1719
|
+
# begin
|
1720
|
+
# invoice_update = {
|
1721
|
+
# customer_notes: "New Notes",
|
1722
|
+
# terms_and_conditions: "New Terms and Conditions"
|
1723
|
+
# }
|
1724
|
+
# invoice = @client.put_invoice(invoice_id: invoice_id, body: invoice_update)
|
1725
|
+
# puts "Updated invoice #{invoice}"
|
1726
|
+
# rescue Recurly::Errors::NotFoundError
|
1727
|
+
# # If the resource was not found, you may want to alert the user or
|
1728
|
+
# # just return nil
|
1729
|
+
# puts "Resource Not Found"
|
1730
|
+
# end
|
1731
|
+
#
|
1618
1732
|
def put_invoice(invoice_id:, body:, **options)
|
1619
1733
|
path = interpolate_path("/invoices/{invoice_id}", invoice_id: invoice_id)
|
1620
1734
|
put(path, body, Requests::InvoiceUpdatable, **options)
|
@@ -1741,11 +1855,34 @@ module Recurly
|
|
1741
1855
|
# @param invoice_id [String] Invoice ID or number. For ID no prefix is used e.g. +e28zov4fw0v2+. For number use prefix +number-+, e.g. +number-1000+.
|
1742
1856
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
1743
1857
|
# @return [Resources::Invoice] The updated invoice.
|
1858
|
+
# @example
|
1859
|
+
# begin
|
1860
|
+
# invoice = @client.void_invoice(invoice_id: invoice_id)
|
1861
|
+
# puts "Voided invoice #{invoice}"
|
1862
|
+
# rescue Recurly::Errors::NotFoundError
|
1863
|
+
# # If the resource was not found, you may want to alert the user or
|
1864
|
+
# # just return nil
|
1865
|
+
# puts "Resource Not Found"
|
1866
|
+
# end
|
1867
|
+
#
|
1744
1868
|
def void_invoice(invoice_id:, **options)
|
1745
1869
|
path = interpolate_path("/invoices/{invoice_id}/void", invoice_id: invoice_id)
|
1746
1870
|
put(path, **options)
|
1747
1871
|
end
|
1748
1872
|
|
1873
|
+
# Record an external payment for a manual invoices.
|
1874
|
+
#
|
1875
|
+
# {https://developers.recurly.com/api/v2019-10-10#operation/record_external_transaction record_external_transaction api documenation}
|
1876
|
+
#
|
1877
|
+
# @param invoice_id [String] Invoice ID or number. For ID no prefix is used e.g. +e28zov4fw0v2+. For number use prefix +number-+, e.g. +number-1000+.
|
1878
|
+
# @param body [Requests::ExternalTransaction] The Hash representing the JSON request to send to the server. It should conform to the schema of {Requests::ExternalTransaction}
|
1879
|
+
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
1880
|
+
# @return [Resources::Transaction] The recorded transaction.
|
1881
|
+
def record_external_transaction(invoice_id:, body:, **options)
|
1882
|
+
path = interpolate_path("/invoices/{invoice_id}/transactions", invoice_id: invoice_id)
|
1883
|
+
post(path, body, Requests::ExternalTransaction, **options)
|
1884
|
+
end
|
1885
|
+
|
1749
1886
|
# List an invoice's line items
|
1750
1887
|
#
|
1751
1888
|
# {https://developers.recurly.com/api/v2019-10-10#operation/list_invoice_line_items list_invoice_line_items api documenation}
|
@@ -1780,6 +1917,15 @@ module Recurly
|
|
1780
1917
|
# @param type [String] Filter by type field.
|
1781
1918
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
1782
1919
|
# @return [Pager<Resources::LineItem>] A list of the invoice's line items.
|
1920
|
+
# @example
|
1921
|
+
# line_items = @client.list_invoice_line_items(
|
1922
|
+
# invoice_id: invoice_id,
|
1923
|
+
# limit: 200
|
1924
|
+
# )
|
1925
|
+
# line_items.each do |line_item|
|
1926
|
+
# puts "Line Item: #{line_item.id}"
|
1927
|
+
# end
|
1928
|
+
#
|
1783
1929
|
def list_invoice_line_items(invoice_id:, **options)
|
1784
1930
|
path = interpolate_path("/invoices/{invoice_id}/line_items", invoice_id: invoice_id)
|
1785
1931
|
pager(path, **options)
|
@@ -1835,6 +1981,15 @@ module Recurly
|
|
1835
1981
|
# @param invoice_id [String] Invoice ID or number. For ID no prefix is used e.g. +e28zov4fw0v2+. For number use prefix +number-+, e.g. +number-1000+.
|
1836
1982
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
1837
1983
|
# @return [Pager<Resources::Invoice>] A list of the credit or charge invoices associated with the invoice.
|
1984
|
+
# @example
|
1985
|
+
# invoices = @client.list_related_invoices(
|
1986
|
+
# invoice_id: invoice_id,
|
1987
|
+
# limit: 200
|
1988
|
+
# )
|
1989
|
+
# invoices.each do |invoice|
|
1990
|
+
# puts "Invoice: #{invoice.number}"
|
1991
|
+
# end
|
1992
|
+
#
|
1838
1993
|
def list_related_invoices(invoice_id:, **options)
|
1839
1994
|
path = interpolate_path("/invoices/{invoice_id}/related_invoices", invoice_id: invoice_id)
|
1840
1995
|
pager(path, **options)
|
@@ -1903,6 +2058,14 @@ module Recurly
|
|
1903
2058
|
# @param type [String] Filter by type field.
|
1904
2059
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
1905
2060
|
# @return [Pager<Resources::LineItem>] A list of the site's line items.
|
2061
|
+
# @example
|
2062
|
+
# line_items = @client.list_line_items(
|
2063
|
+
# limit: 200
|
2064
|
+
# )
|
2065
|
+
# line_items.each do |line_item|
|
2066
|
+
# puts "LineItem: #{line_item.id}"
|
2067
|
+
# end
|
2068
|
+
#
|
1906
2069
|
def list_line_items(**options)
|
1907
2070
|
path = interpolate_path("/line_items")
|
1908
2071
|
pager(path, **options)
|
@@ -2065,6 +2228,19 @@ module Recurly
|
|
2065
2228
|
# @param body [Requests::PlanUpdate] The Hash representing the JSON request to send to the server. It should conform to the schema of {Requests::PlanUpdate}
|
2066
2229
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
2067
2230
|
# @return [Resources::Plan] A plan.
|
2231
|
+
# @example
|
2232
|
+
# begin
|
2233
|
+
# plan_update = {
|
2234
|
+
# name: "Monthly Kombucha Subscription"
|
2235
|
+
# }
|
2236
|
+
# plan = @client.update_plan(plan_id: plan_id, body: plan_update)
|
2237
|
+
# puts "Updated plan #{plan}"
|
2238
|
+
# rescue Recurly::Errors::NotFoundError
|
2239
|
+
# # If the resource was not found, you may want to alert the user or
|
2240
|
+
# # just return nil
|
2241
|
+
# puts "Resource Not Found"
|
2242
|
+
# end
|
2243
|
+
#
|
2068
2244
|
def update_plan(plan_id:, body:, **options)
|
2069
2245
|
path = interpolate_path("/plans/{plan_id}", plan_id: plan_id)
|
2070
2246
|
put(path, body, Requests::PlanUpdate, **options)
|
@@ -2077,6 +2253,16 @@ module Recurly
|
|
2077
2253
|
# @param plan_id [String] Plan ID or code. For ID no prefix is used e.g. +e28zov4fw0v2+. For code use prefix +code-+, e.g. +code-gold+.
|
2078
2254
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
2079
2255
|
# @return [Resources::Plan] Plan deleted
|
2256
|
+
# @example
|
2257
|
+
# begin
|
2258
|
+
# plan = @client.remove_plan(plan_id: plan_id)
|
2259
|
+
# puts "Removed plan #{plan}"
|
2260
|
+
# rescue Recurly::Errors::NotFoundError
|
2261
|
+
# # If the resource was not found, you may want to alert the user or
|
2262
|
+
# # just return nil
|
2263
|
+
# puts "Resource Not Found"
|
2264
|
+
# end
|
2265
|
+
#
|
2080
2266
|
def remove_plan(plan_id:, **options)
|
2081
2267
|
path = interpolate_path("/plans/{plan_id}", plan_id: plan_id)
|
2082
2268
|
delete(path, **options)
|
@@ -2136,6 +2322,27 @@ module Recurly
|
|
2136
2322
|
# @param body [Requests::AddOnCreate] The Hash representing the JSON request to send to the server. It should conform to the schema of {Requests::AddOnCreate}
|
2137
2323
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
2138
2324
|
# @return [Resources::AddOn] An add-on.
|
2325
|
+
# @example
|
2326
|
+
# begin
|
2327
|
+
# new_add_on = {
|
2328
|
+
# code: 'coffee_grinder',
|
2329
|
+
# name: 'A quality grinder for your beans',
|
2330
|
+
# default_quantity: 1,
|
2331
|
+
# currencies: [
|
2332
|
+
# {
|
2333
|
+
# currency: 'USD',
|
2334
|
+
# unit_amount: 10_000
|
2335
|
+
# }
|
2336
|
+
# ]
|
2337
|
+
# }
|
2338
|
+
# add_on = @client.create_plan_add_on(plan_id: plan_id, body: new_add_on)
|
2339
|
+
# puts "Created plan add-on #{add_on}"
|
2340
|
+
# rescue Recurly::Errors::NotFoundError
|
2341
|
+
# # If the resource was not found, you may want to alert the user or
|
2342
|
+
# # just return nil
|
2343
|
+
# puts "Resource Not Found"
|
2344
|
+
# end
|
2345
|
+
#
|
2139
2346
|
def create_plan_add_on(plan_id:, body:, **options)
|
2140
2347
|
path = interpolate_path("/plans/{plan_id}/add_ons", plan_id: plan_id)
|
2141
2348
|
post(path, body, Requests::AddOnCreate, **options)
|
@@ -2175,6 +2382,23 @@ module Recurly
|
|
2175
2382
|
# @param body [Requests::AddOnUpdate] The Hash representing the JSON request to send to the server. It should conform to the schema of {Requests::AddOnUpdate}
|
2176
2383
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
2177
2384
|
# @return [Resources::AddOn] An add-on.
|
2385
|
+
# @example
|
2386
|
+
# begin
|
2387
|
+
# add_on_update = {
|
2388
|
+
# name: "A quality grinder for your finest beans"
|
2389
|
+
# }
|
2390
|
+
# add_on = @client.update_plan_add_on(
|
2391
|
+
# plan_id: plan_id,
|
2392
|
+
# add_on_id: add_on_id,
|
2393
|
+
# body: add_on_update
|
2394
|
+
# )
|
2395
|
+
# puts "Updated add-on #{add_on}"
|
2396
|
+
# rescue Recurly::Errors::NotFoundError
|
2397
|
+
# # If the resource was not found, you may want to alert the user or
|
2398
|
+
# # just return nil
|
2399
|
+
# puts "Resource Not Found"
|
2400
|
+
# end
|
2401
|
+
#
|
2178
2402
|
def update_plan_add_on(plan_id:, add_on_id:, body:, **options)
|
2179
2403
|
path = interpolate_path("/plans/{plan_id}/add_ons/{add_on_id}", plan_id: plan_id, add_on_id: add_on_id)
|
2180
2404
|
put(path, body, Requests::AddOnUpdate, **options)
|
@@ -2188,6 +2412,19 @@ module Recurly
|
|
2188
2412
|
# @param add_on_id [String] Add-on ID or code. For ID no prefix is used e.g. +e28zov4fw0v2+. For code use prefix +code-+, e.g. +code-gold+.
|
2189
2413
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
2190
2414
|
# @return [Resources::AddOn] Add-on deleted
|
2415
|
+
# @example
|
2416
|
+
# begin
|
2417
|
+
# add_on = @client.remove_plan_add_on(
|
2418
|
+
# plan_id: plan_id,
|
2419
|
+
# add_on_id: add_on_id
|
2420
|
+
# )
|
2421
|
+
# puts "Removed add-on #{add_on}"
|
2422
|
+
# rescue Recurly::Errors::NotFoundError
|
2423
|
+
# # If the resource was not found, you may want to alert the user or
|
2424
|
+
# # just return nil
|
2425
|
+
# puts "Resource Not Found"
|
2426
|
+
# end
|
2427
|
+
#
|
2191
2428
|
def remove_plan_add_on(plan_id:, add_on_id:, **options)
|
2192
2429
|
path = interpolate_path("/plans/{plan_id}/add_ons/{add_on_id}", plan_id: plan_id, add_on_id: add_on_id)
|
2193
2430
|
delete(path, **options)
|
@@ -2224,6 +2461,14 @@ module Recurly
|
|
2224
2461
|
# @param state [String] Filter by state.
|
2225
2462
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
2226
2463
|
# @return [Pager<Resources::AddOn>] A list of add-ons.
|
2464
|
+
# @example
|
2465
|
+
# add_ons = @client.list_add_ons(
|
2466
|
+
# limit: 200
|
2467
|
+
# )
|
2468
|
+
# add_ons.each do |add_on|
|
2469
|
+
# puts "AddOn: #{add_on.code}"
|
2470
|
+
# end
|
2471
|
+
#
|
2227
2472
|
def list_add_ons(**options)
|
2228
2473
|
path = interpolate_path("/add_ons")
|
2229
2474
|
pager(path, **options)
|
@@ -2236,6 +2481,16 @@ module Recurly
|
|
2236
2481
|
# @param add_on_id [String] Add-on ID or code. For ID no prefix is used e.g. +e28zov4fw0v2+. For code use prefix +code-+, e.g. +code-gold+.
|
2237
2482
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
2238
2483
|
# @return [Resources::AddOn] An add-on.
|
2484
|
+
# @example
|
2485
|
+
# begin
|
2486
|
+
# add_on = @client.get_add_on(add_on_id: add_on_id)
|
2487
|
+
# puts "Got add-on #{add_on}"
|
2488
|
+
# rescue Recurly::Errors::NotFoundError
|
2489
|
+
# # If the resource was not found, you may want to alert the user or
|
2490
|
+
# # just return nil
|
2491
|
+
# puts "Resource Not Found"
|
2492
|
+
# end
|
2493
|
+
#
|
2239
2494
|
def get_add_on(add_on_id:, **options)
|
2240
2495
|
path = interpolate_path("/add_ons/{add_on_id}", add_on_id: add_on_id)
|
2241
2496
|
get(path, **options)
|
@@ -2271,23 +2526,68 @@ module Recurly
|
|
2271
2526
|
#
|
2272
2527
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
2273
2528
|
# @return [Pager<Resources::ShippingMethod>] A list of the site's shipping methods.
|
2529
|
+
# @example
|
2530
|
+
# shipping_methods = @client.list_shipping_methods(
|
2531
|
+
# limit: 200
|
2532
|
+
# )
|
2533
|
+
# shipping_methods.each do |shipping_method|
|
2534
|
+
# puts "Shipping Method: #{shipping_method.code}"
|
2535
|
+
# end
|
2536
|
+
#
|
2274
2537
|
def list_shipping_methods(**options)
|
2275
2538
|
path = interpolate_path("/shipping_methods")
|
2276
2539
|
pager(path, **options)
|
2277
2540
|
end
|
2278
2541
|
|
2542
|
+
# Create a new shipping method
|
2543
|
+
#
|
2544
|
+
# {https://developers.recurly.com/api/v2019-10-10#operation/create_shipping_method create_shipping_method api documenation}
|
2545
|
+
#
|
2546
|
+
# @param body [Requests::ShippingMethodCreate] The Hash representing the JSON request to send to the server. It should conform to the schema of {Requests::ShippingMethodCreate}
|
2547
|
+
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
2548
|
+
# @return [Resources::ShippingMethod] A new shipping method.
|
2549
|
+
def create_shipping_method(body:, **options)
|
2550
|
+
path = interpolate_path("/shipping_methods")
|
2551
|
+
post(path, body, Requests::ShippingMethodCreate, **options)
|
2552
|
+
end
|
2553
|
+
|
2279
2554
|
# Fetch a shipping method
|
2280
2555
|
#
|
2281
2556
|
# {https://developers.recurly.com/api/v2019-10-10#operation/get_shipping_method get_shipping_method api documenation}
|
2282
2557
|
#
|
2283
2558
|
# @param id [String] Shipping Method ID or code. For ID no prefix is used e.g. +e28zov4fw0v2+. For code use prefix +code-+, e.g. +code-usps_2-day+.
|
2284
2559
|
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
2285
|
-
# @return [Resources::ShippingMethod] A
|
2560
|
+
# @return [Resources::ShippingMethod] A shipping method.
|
2286
2561
|
def get_shipping_method(id:, **options)
|
2287
2562
|
path = interpolate_path("/shipping_methods/{id}", id: id)
|
2288
2563
|
get(path, **options)
|
2289
2564
|
end
|
2290
2565
|
|
2566
|
+
# Update an active Shipping Method
|
2567
|
+
#
|
2568
|
+
# {https://developers.recurly.com/api/v2019-10-10#operation/update_shipping_method update_shipping_method api documenation}
|
2569
|
+
#
|
2570
|
+
# @param shipping_method_id [String] Shipping Method ID or code. For ID no prefix is used e.g. +e28zov4fw0v2+. For code use prefix +code-+, e.g. +code-usps_2-day+.
|
2571
|
+
# @param body [Requests::ShippingMethodUpdate] The Hash representing the JSON request to send to the server. It should conform to the schema of {Requests::ShippingMethodUpdate}
|
2572
|
+
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
2573
|
+
# @return [Resources::ShippingMethod] The updated shipping method.
|
2574
|
+
def update_shipping_method(shipping_method_id:, body:, **options)
|
2575
|
+
path = interpolate_path("/shipping_methods/{shipping_method_id}", shipping_method_id: shipping_method_id)
|
2576
|
+
put(path, body, Requests::ShippingMethodUpdate, **options)
|
2577
|
+
end
|
2578
|
+
|
2579
|
+
# Deactivate a shipping method
|
2580
|
+
#
|
2581
|
+
# {https://developers.recurly.com/api/v2019-10-10#operation/deactivate_shipping_method deactivate_shipping_method api documenation}
|
2582
|
+
#
|
2583
|
+
# @param shipping_method_id [String] Shipping Method ID or code. For ID no prefix is used e.g. +e28zov4fw0v2+. For code use prefix +code-+, e.g. +code-usps_2-day+.
|
2584
|
+
# @param site_id [String] Site ID or subdomain. For ID no prefix is used e.g. +e28zov4fw0v2+. For subdomain use prefix +subdomain-+, e.g. +subdomain-recurly+.
|
2585
|
+
# @return [Resources::ShippingMethod] A shipping method.
|
2586
|
+
def deactivate_shipping_method(shipping_method_id:, **options)
|
2587
|
+
path = interpolate_path("/shipping_methods/{shipping_method_id}", shipping_method_id: shipping_method_id)
|
2588
|
+
delete(path, **options)
|
2589
|
+
end
|
2590
|
+
|
2291
2591
|
# List a site's subscriptions
|
2292
2592
|
#
|
2293
2593
|
# {https://developers.recurly.com/api/v2019-10-10#operation/list_subscriptions list_subscriptions api documenation}
|