braintree 2.45.0 → 2.46.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.
- data/lib/braintree.rb +5 -0
- data/lib/braintree/add_on_gateway.rb +2 -1
- data/lib/braintree/address_gateway.rb +5 -4
- data/lib/braintree/client_token_gateway.rb +2 -1
- data/lib/braintree/configuration.rb +59 -7
- data/lib/braintree/credentials_parser.rb +40 -0
- data/lib/braintree/credit_card_gateway.rb +12 -11
- data/lib/braintree/credit_card_verification_gateway.rb +4 -3
- data/lib/braintree/customer_gateway.rb +12 -11
- data/lib/braintree/discount_gateway.rb +2 -1
- data/lib/braintree/error_codes.rb +9 -0
- data/lib/braintree/europe_bank_account_gateway.rb +2 -1
- data/lib/braintree/exceptions.rb +1 -5
- data/lib/braintree/gateway.rb +8 -0
- data/lib/braintree/http.rb +8 -2
- data/lib/braintree/merchant.rb +19 -0
- data/lib/braintree/merchant_account_gateway.rb +6 -5
- data/lib/braintree/merchant_gateway.rb +27 -0
- data/lib/braintree/oauth_credentials.rb +19 -0
- data/lib/braintree/oauth_gateway.rb +68 -0
- data/lib/braintree/payment_method_gateway.rb +7 -6
- data/lib/braintree/payment_method_nonce_gateway.rb +3 -2
- data/lib/braintree/paypal_account_gateway.rb +5 -4
- data/lib/braintree/plan_gateway.rb +2 -1
- data/lib/braintree/settlement_batch_summary_gateway.rb +2 -1
- data/lib/braintree/subscription_gateway.rb +8 -7
- data/lib/braintree/successful_result.rb +1 -1
- data/lib/braintree/testing_gateway.rb +5 -4
- data/lib/braintree/transaction.rb +1 -0
- data/lib/braintree/transaction_gateway.rb +12 -11
- data/lib/braintree/transaction_search.rb +3 -0
- data/lib/braintree/transparent_redirect_gateway.rb +1 -0
- data/lib/braintree/version.rb +1 -1
- data/lib/braintree/webhook_notification_gateway.rb +1 -0
- data/lib/braintree/webhook_testing_gateway.rb +1 -0
- data/spec/httpsd.pid +1 -1
- data/spec/integration/braintree/add_on_spec.rb +12 -0
- data/spec/integration/braintree/customer_spec.rb +31 -0
- data/spec/integration/braintree/http_spec.rb +10 -6
- data/spec/integration/braintree/merchant_account_spec.rb +0 -7
- data/spec/integration/braintree/merchant_spec.rb +55 -0
- data/spec/integration/braintree/oauth_spec.rb +191 -0
- data/spec/integration/braintree/plan_spec.rb +2 -1
- data/spec/integration/braintree/transaction_search_spec.rb +63 -0
- data/spec/integration/braintree/transaction_spec.rb +73 -4
- data/spec/integration/spec_helper.rb +1 -1
- data/spec/oauth_test_helper.rb +17 -0
- data/spec/spec_helper.rb +8 -4
- data/spec/unit/braintree/configuration_spec.rb +23 -0
- data/spec/unit/braintree/credentials_parser_spec.rb +81 -0
- metadata +161 -148
- checksums.yaml +0 -15
data/lib/braintree.rb
CHANGED
@@ -32,6 +32,7 @@ require "braintree/client_token"
|
|
32
32
|
require "braintree/client_token_gateway"
|
33
33
|
require "braintree/coinbase_account"
|
34
34
|
require "braintree/configuration"
|
35
|
+
require "braintree/credentials_parser"
|
35
36
|
require "braintree/credit_card"
|
36
37
|
require "braintree/credit_card_gateway"
|
37
38
|
require "braintree/credit_card_verification"
|
@@ -51,12 +52,16 @@ require "braintree/error_result"
|
|
51
52
|
require "braintree/errors"
|
52
53
|
require "braintree/gateway"
|
53
54
|
require "braintree/http"
|
55
|
+
require "braintree/merchant"
|
56
|
+
require "braintree/merchant_gateway"
|
54
57
|
require "braintree/merchant_account"
|
55
58
|
require "braintree/merchant_account_gateway"
|
56
59
|
require "braintree/merchant_account/individual_details"
|
57
60
|
require "braintree/merchant_account/business_details"
|
58
61
|
require "braintree/merchant_account/funding_details"
|
59
62
|
require "braintree/merchant_account/address_details"
|
63
|
+
require "braintree/oauth_gateway"
|
64
|
+
require "braintree/oauth_credentials"
|
60
65
|
require "braintree/payment_instrument_type"
|
61
66
|
require "braintree/payment_method"
|
62
67
|
require "braintree/payment_method_gateway"
|
@@ -3,10 +3,11 @@ module Braintree
|
|
3
3
|
def initialize(gateway)
|
4
4
|
@gateway = gateway
|
5
5
|
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
6
7
|
end
|
7
8
|
|
8
9
|
def all
|
9
|
-
response = @config.http.get
|
10
|
+
response = @config.http.get("#{@config.base_merchant_path}/add_ons")
|
10
11
|
attributes_collection = response[:add_ons]
|
11
12
|
attributes_collection.map do |attributes|
|
12
13
|
AddOn._new(attributes)
|
@@ -3,6 +3,7 @@ module Braintree
|
|
3
3
|
def initialize(gateway)
|
4
4
|
@gateway = gateway
|
5
5
|
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
6
7
|
end
|
7
8
|
|
8
9
|
def create(attributes)
|
@@ -13,7 +14,7 @@ module Braintree
|
|
13
14
|
unless attributes[:customer_id] =~ /\A[0-9A-Za-z_-]+\z/
|
14
15
|
raise ArgumentError, ":customer_id contains invalid characters"
|
15
16
|
end
|
16
|
-
response = @config.http.post
|
17
|
+
response = @config.http.post("#{@config.base_merchant_path}/customers/#{attributes.delete(:customer_id)}/addresses", :address => attributes)
|
17
18
|
if response[:address]
|
18
19
|
SuccessfulResult.new(:address => Address._new(@gateway, response[:address]))
|
19
20
|
elsif response[:api_error_response]
|
@@ -25,14 +26,14 @@ module Braintree
|
|
25
26
|
|
26
27
|
def delete(customer_or_customer_id, address_id)
|
27
28
|
customer_id = _determine_customer_id(customer_or_customer_id)
|
28
|
-
@config.http.delete("/customers/#{customer_id}/addresses/#{address_id}")
|
29
|
+
@config.http.delete("#{@config.base_merchant_path}/customers/#{customer_id}/addresses/#{address_id}")
|
29
30
|
SuccessfulResult.new
|
30
31
|
end
|
31
32
|
|
32
33
|
def find(customer_or_customer_id, address_id)
|
33
34
|
customer_id = _determine_customer_id(customer_or_customer_id)
|
34
35
|
raise ArgumentError if address_id.nil? || address_id.to_s.strip == ""
|
35
|
-
response = @config.http.get("/customers/#{customer_id}/addresses/#{address_id}")
|
36
|
+
response = @config.http.get("#{@config.base_merchant_path}/customers/#{customer_id}/addresses/#{address_id}")
|
36
37
|
Address._new(@gateway, response[:address])
|
37
38
|
rescue NotFoundError
|
38
39
|
raise NotFoundError, "address for customer #{customer_id.inspect} with id #{address_id.inspect} not found"
|
@@ -41,7 +42,7 @@ module Braintree
|
|
41
42
|
def update(customer_or_customer_id, address_id, attributes)
|
42
43
|
Util.verify_keys(AddressGateway._update_signature, attributes)
|
43
44
|
customer_id = _determine_customer_id(customer_or_customer_id)
|
44
|
-
response = @config.http.put
|
45
|
+
response = @config.http.put("#{@config.base_merchant_path}/customers/#{customer_id}/addresses/#{address_id}", :address => attributes)
|
45
46
|
if response[:address]
|
46
47
|
SuccessfulResult.new(:address => Address._new(@gateway, response[:address]))
|
47
48
|
elsif response[:api_error_response]
|
@@ -3,6 +3,7 @@ module Braintree
|
|
3
3
|
def initialize(gateway)
|
4
4
|
@gateway = gateway
|
5
5
|
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
6
7
|
end
|
7
8
|
|
8
9
|
def generate(options={})
|
@@ -11,7 +12,7 @@ module Braintree
|
|
11
12
|
Util.verify_keys(ClientTokenGateway._generate_signature, options)
|
12
13
|
params = {:client_token => options}
|
13
14
|
end
|
14
|
-
result = @config.http.post("/client_token", params)
|
15
|
+
result = @config.http.post("#{@config.base_merchant_path}/client_token", params)
|
15
16
|
|
16
17
|
if result[:client_token]
|
17
18
|
result[:client_token][:value]
|
@@ -7,6 +7,9 @@ module Braintree
|
|
7
7
|
:merchant_id,
|
8
8
|
:public_key,
|
9
9
|
:private_key,
|
10
|
+
:client_id,
|
11
|
+
:client_secret,
|
12
|
+
:access_token,
|
10
13
|
]
|
11
14
|
|
12
15
|
WRITABLE_ATTRIBUTES = [
|
@@ -30,7 +33,7 @@ module Braintree
|
|
30
33
|
attributes.each do |attribute|
|
31
34
|
(class << self; self; end).send(:define_method, attribute) do
|
32
35
|
attribute_value = instance_variable_get("@#{attribute}")
|
33
|
-
raise ConfigurationError.new(attribute.to_s
|
36
|
+
raise ConfigurationError.new("Braintree::Configuration.#{attribute.to_s} needs to be set") unless attribute_value
|
34
37
|
attribute_value
|
35
38
|
end
|
36
39
|
end
|
@@ -88,7 +91,36 @@ module Braintree
|
|
88
91
|
instance_variable_set "@#{attr}", options[attr]
|
89
92
|
end
|
90
93
|
|
91
|
-
|
94
|
+
_check_for_mixed_credentials(options)
|
95
|
+
|
96
|
+
parser = Braintree::CredentialsParser.new
|
97
|
+
if options[:client_id] || options[:client_secret]
|
98
|
+
parser.parse_client_credentials(options[:client_id], options[:client_secret])
|
99
|
+
@client_id = parser.client_id
|
100
|
+
@client_secret = parser.client_secret
|
101
|
+
@environment = parser.environment
|
102
|
+
elsif options[:access_token]
|
103
|
+
parser.parse_access_token(options[:access_token])
|
104
|
+
@access_token = parser.access_token
|
105
|
+
@environment = parser.environment
|
106
|
+
@merchant_id = parser.merchant_id
|
107
|
+
else
|
108
|
+
@merchant_id = options[:merchant_id] || options[:partner_id]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
def _check_for_mixed_credentials(options)
|
113
|
+
if (options[:client_id] || options[:client_secret]) && (options[:public_key] || options[:private_key])
|
114
|
+
raise ConfigurationError.new("Braintree::Gateway cannot be initialized with mixed credential types: client_id and client_secret mixed with public_key and private_key.")
|
115
|
+
end
|
116
|
+
|
117
|
+
if (options[:client_id] || options[:client_secret]) && (options[:access_token])
|
118
|
+
raise ConfigurationError.new("Braintree::Gateway cannot be initialized with mixed credential types: client_id and client_secret mixed with access_token.")
|
119
|
+
end
|
120
|
+
|
121
|
+
if (options[:public_key] || options[:private_key]) && (options[:access_token])
|
122
|
+
raise ConfigurationError.new("Braintree::Gateway cannot be initialized with mixed credential types: public_key and private_key mixed with access_token.")
|
123
|
+
end
|
92
124
|
end
|
93
125
|
|
94
126
|
def api_version # :nodoc:
|
@@ -99,8 +131,12 @@ module Braintree
|
|
99
131
|
"/merchants/#{merchant_id}"
|
100
132
|
end
|
101
133
|
|
134
|
+
def base_url
|
135
|
+
"#{protocol}://#{server}:#{port}"
|
136
|
+
end
|
137
|
+
|
102
138
|
def base_merchant_url # :nodoc:
|
103
|
-
"#{
|
139
|
+
"#{base_url}#{base_merchant_path}"
|
104
140
|
end
|
105
141
|
|
106
142
|
def ca_file # :nodoc:
|
@@ -121,7 +157,7 @@ module Braintree
|
|
121
157
|
|
122
158
|
def port # :nodoc:
|
123
159
|
case @environment
|
124
|
-
when :development
|
160
|
+
when :development, :integration
|
125
161
|
ENV['GATEWAY_PORT'] || 3000
|
126
162
|
when :production, :qa, :sandbox
|
127
163
|
443
|
@@ -142,7 +178,7 @@ module Braintree
|
|
142
178
|
|
143
179
|
def server # :nodoc:
|
144
180
|
case @environment
|
145
|
-
when :development
|
181
|
+
when :development, :integration
|
146
182
|
"localhost"
|
147
183
|
when :production
|
148
184
|
"#{endpoint}.braintreegateway.com"
|
@@ -155,7 +191,7 @@ module Braintree
|
|
155
191
|
|
156
192
|
def auth_url
|
157
193
|
case @environment
|
158
|
-
when :development
|
194
|
+
when :development, :integration
|
159
195
|
"http://auth.venmo.dev:9292"
|
160
196
|
when :production
|
161
197
|
"https://auth.venmo.com"
|
@@ -168,7 +204,7 @@ module Braintree
|
|
168
204
|
|
169
205
|
def ssl? # :nodoc:
|
170
206
|
case @environment
|
171
|
-
when :development
|
207
|
+
when :development, :integration
|
172
208
|
false
|
173
209
|
when :production, :qa, :sandbox
|
174
210
|
true
|
@@ -190,6 +226,22 @@ module Braintree
|
|
190
226
|
super.gsub(/@private_key=\".*\"/, '@private_key="[FILTERED]"')
|
191
227
|
end
|
192
228
|
|
229
|
+
def client_credentials?
|
230
|
+
!client_id.nil?
|
231
|
+
end
|
232
|
+
|
233
|
+
def assert_has_client_credentials
|
234
|
+
if client_id.nil? || client_secret.nil?
|
235
|
+
raise ConfigurationError.new("Braintree::Gateway client_id and client_secret are required.")
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
def assert_has_access_token_or_keys
|
240
|
+
if (public_key.nil? || private_key.nil?) && access_token.nil?
|
241
|
+
raise ConfigurationError.new("Braintree::Gateway public_key and private_key are required.")
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
193
245
|
def signature_service
|
194
246
|
@signature_service ||= SignatureService.new(@private_key)
|
195
247
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Braintree
|
2
|
+
class CredentialsParser
|
3
|
+
attr_reader :client_id, :client_secret, :access_token, :environment, :merchant_id
|
4
|
+
|
5
|
+
def parse_client_credentials(client_id, client_secret)
|
6
|
+
raise ConfigurationError.new("Missing client_id when constructing Braintree::Gateway") if client_id.nil?
|
7
|
+
raise ConfigurationError.new("Value passed for client_id is not a client_id") unless client_id.start_with?("client_id")
|
8
|
+
|
9
|
+
raise ConfigurationError.new("Missing client_secret when constructing Braintree::Gateway") if client_secret.nil?
|
10
|
+
raise ConfigurationError.new("Value passed for client_secret is not a client_secret") unless client_secret.start_with?("client_secret")
|
11
|
+
client_id_environment = parse_environment(client_id)
|
12
|
+
client_secret_environment = parse_environment(client_secret)
|
13
|
+
|
14
|
+
if client_id_environment != client_secret_environment
|
15
|
+
raise ConfigurationError.new("Mismatched credential environments: client_id environment is #{client_id_environment} and client_secret environment is #{client_secret_environment}")
|
16
|
+
end
|
17
|
+
|
18
|
+
@client_id = client_id
|
19
|
+
@client_secret = client_secret
|
20
|
+
@environment = client_id_environment
|
21
|
+
end
|
22
|
+
|
23
|
+
def parse_access_token(access_token)
|
24
|
+
raise ConfigurationError.new("Missing access_token when constructing Braintree::Gateway") if access_token.nil?
|
25
|
+
raise ConfigurationError.new("Value passed for access_token is not a valid access_token") unless access_token.start_with?("access_token")
|
26
|
+
|
27
|
+
@access_token = access_token
|
28
|
+
@environment = parse_environment(access_token)
|
29
|
+
@merchant_id = parse_merchant_id(access_token)
|
30
|
+
end
|
31
|
+
|
32
|
+
def parse_environment(credential)
|
33
|
+
credential.split("$")[1].to_sym
|
34
|
+
end
|
35
|
+
|
36
|
+
def parse_merchant_id(access_token)
|
37
|
+
access_token.split("$")[2]
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -3,6 +3,7 @@ module Braintree
|
|
3
3
|
def initialize(gateway)
|
4
4
|
@gateway = gateway
|
5
5
|
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
6
7
|
end
|
7
8
|
|
8
9
|
def create(attributes)
|
@@ -25,24 +26,24 @@ module Braintree
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def delete(token)
|
28
|
-
@config.http.delete("/payment_methods/credit_card/#{token}")
|
29
|
+
@config.http.delete("#{@config.base_merchant_path}/payment_methods/credit_card/#{token}")
|
29
30
|
end
|
30
31
|
|
31
32
|
def expired(options = {})
|
32
|
-
response = @config.http.post("/payment_methods/all/expired_ids")
|
33
|
+
response = @config.http.post("#{@config.base_merchant_path}/payment_methods/all/expired_ids")
|
33
34
|
ResourceCollection.new(response) { |ids| _fetch_expired(ids) }
|
34
35
|
end
|
35
36
|
|
36
37
|
def expiring_between(start_date, end_date, options = {})
|
37
38
|
formatted_start_date = start_date.strftime('%m%Y')
|
38
39
|
formatted_end_date = end_date.strftime('%m%Y')
|
39
|
-
response = @config.http.post("/payment_methods/all/expiring_ids?start=#{formatted_start_date}&end=#{formatted_end_date}")
|
40
|
+
response = @config.http.post("#{@config.base_merchant_path}/payment_methods/all/expiring_ids?start=#{formatted_start_date}&end=#{formatted_end_date}")
|
40
41
|
ResourceCollection.new(response) { |ids| _fetch_expiring_between(formatted_start_date, formatted_end_date, ids) }
|
41
42
|
end
|
42
43
|
|
43
44
|
def find(token)
|
44
45
|
raise ArgumentError if token.nil? || token.to_s.strip == ""
|
45
|
-
response = @config.http.get
|
46
|
+
response = @config.http.get("#{@config.base_merchant_path}/payment_methods/credit_card/#{token}")
|
46
47
|
CreditCard._new(@gateway, response[:credit_card])
|
47
48
|
rescue NotFoundError
|
48
49
|
raise NotFoundError, "payment method with token #{token.inspect} not found"
|
@@ -50,7 +51,7 @@ module Braintree
|
|
50
51
|
|
51
52
|
def from_nonce(nonce)
|
52
53
|
raise ArgumentError if nonce.nil? || nonce.to_s.strip == ""
|
53
|
-
response = @config.http.get
|
54
|
+
response = @config.http.get("#{@config.base_merchant_path}/payment_methods/from_nonce/#{nonce}")
|
54
55
|
CreditCard._new(@gateway, response[:credit_card])
|
55
56
|
rescue NotFoundError
|
56
57
|
raise NotFoundError, "nonce #{nonce.inspect} locked, consumed, or not found"
|
@@ -106,8 +107,8 @@ module Braintree
|
|
106
107
|
return signature
|
107
108
|
end
|
108
109
|
|
109
|
-
def _do_create(
|
110
|
-
response = @config.http.post
|
110
|
+
def _do_create(path, params=nil) # :nodoc:
|
111
|
+
response = @config.http.post("#{@config.base_merchant_path}#{path}", params)
|
111
112
|
if response[:credit_card]
|
112
113
|
SuccessfulResult.new(:credit_card => CreditCard._new(@gateway, response[:credit_card]))
|
113
114
|
elsif response[:api_error_response]
|
@@ -117,8 +118,8 @@ module Braintree
|
|
117
118
|
end
|
118
119
|
end
|
119
120
|
|
120
|
-
def _do_update(http_verb,
|
121
|
-
response = @config.http.send
|
121
|
+
def _do_update(http_verb, path, params) # :nodoc:
|
122
|
+
response = @config.http.send(http_verb, "#{@config.base_merchant_path}#{path}", params)
|
122
123
|
if response[:credit_card]
|
123
124
|
SuccessfulResult.new(:credit_card => CreditCard._new(@gateway, response[:credit_card]))
|
124
125
|
elsif response[:api_error_response]
|
@@ -129,14 +130,14 @@ module Braintree
|
|
129
130
|
end
|
130
131
|
|
131
132
|
def _fetch_expired(ids) # :nodoc:
|
132
|
-
response = @config.http.post("/payment_methods/all/expired", :search => {:ids => ids})
|
133
|
+
response = @config.http.post("#{@config.base_merchant_path}/payment_methods/all/expired", :search => {:ids => ids})
|
133
134
|
attributes = response[:payment_methods]
|
134
135
|
Util.extract_attribute_as_array(attributes, :credit_card).map { |attrs| CreditCard._new(@gateway, attrs) }
|
135
136
|
end
|
136
137
|
|
137
138
|
def _fetch_expiring_between(formatted_start_date, formatted_end_date, ids) # :nodoc:
|
138
139
|
response = @config.http.post(
|
139
|
-
"/payment_methods/all/expiring?start=#{formatted_start_date}&end=#{formatted_end_date}",
|
140
|
+
"#{@config.base_merchant_path}/payment_methods/all/expiring?start=#{formatted_start_date}&end=#{formatted_end_date}",
|
140
141
|
:search => {:ids => ids}
|
141
142
|
)
|
142
143
|
attributes = response[:payment_methods]
|
@@ -3,11 +3,12 @@ module Braintree
|
|
3
3
|
def initialize(gateway)
|
4
4
|
@gateway = gateway
|
5
5
|
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
6
7
|
end
|
7
8
|
|
8
9
|
def find(id)
|
9
10
|
raise ArgumentError if id.nil? || id.strip.to_s == ""
|
10
|
-
response = @config.http.get
|
11
|
+
response = @config.http.get("#{@config.base_merchant_path}/verifications/#{id}")
|
11
12
|
CreditCardVerification._new(response[:verification])
|
12
13
|
rescue NotFoundError
|
13
14
|
raise NotFoundError, "verification with id #{id.inspect} not found"
|
@@ -17,13 +18,13 @@ module Braintree
|
|
17
18
|
search = CreditCardVerificationSearch.new
|
18
19
|
block.call(search) if block
|
19
20
|
|
20
|
-
response = @config.http.post
|
21
|
+
response = @config.http.post("#{@config.base_merchant_path}/verifications/advanced_search_ids", {:search => search.to_hash})
|
21
22
|
ResourceCollection.new(response) { |ids| _fetch_verifications(search, ids) }
|
22
23
|
end
|
23
24
|
|
24
25
|
def _fetch_verifications(search, ids)
|
25
26
|
search.ids.in ids
|
26
|
-
response = @config.http.post
|
27
|
+
response = @config.http.post("#{@config.base_merchant_path}/verifications/advanced_search", {:search => search.to_hash})
|
27
28
|
attributes = response[:credit_card_verifications]
|
28
29
|
Util.extract_attribute_as_array(attributes, :verification).map { |attrs| CreditCardVerification._new(attrs) }
|
29
30
|
end
|
@@ -3,10 +3,11 @@ module Braintree
|
|
3
3
|
def initialize(gateway)
|
4
4
|
@gateway = gateway
|
5
5
|
@config = gateway.config
|
6
|
+
@config.assert_has_access_token_or_keys
|
6
7
|
end
|
7
8
|
|
8
9
|
def all
|
9
|
-
response = @config.http.post
|
10
|
+
response = @config.http.post("#{@config.base_merchant_path}/customers/advanced_search_ids")
|
10
11
|
ResourceCollection.new(response) { |ids| _fetch_customers(CustomerSearch.new, ids) }
|
11
12
|
end
|
12
13
|
|
@@ -27,14 +28,14 @@ module Braintree
|
|
27
28
|
end
|
28
29
|
|
29
30
|
def delete(customer_id)
|
30
|
-
@config.http.delete("/customers/#{customer_id}")
|
31
|
+
@config.http.delete("#{@config.base_merchant_path}/customers/#{customer_id}")
|
31
32
|
SuccessfulResult.new
|
32
33
|
end
|
33
34
|
|
34
35
|
def find(customer_id)
|
35
36
|
raise ArgumentError, "customer_id contains invalid characters" unless customer_id.to_s =~ /\A[\w-]+\z/
|
36
37
|
raise ArgumentError, "customer_id cannot be blank" if customer_id.nil?|| customer_id.to_s.strip == ""
|
37
|
-
response = @config.http.get("/customers/#{customer_id}")
|
38
|
+
response = @config.http.get("#{@config.base_merchant_path}/customers/#{customer_id}")
|
38
39
|
Customer._new(@gateway, response[:customer])
|
39
40
|
rescue NotFoundError
|
40
41
|
raise NotFoundError, "customer with id #{customer_id.inspect} not found"
|
@@ -44,12 +45,12 @@ module Braintree
|
|
44
45
|
search = CustomerSearch.new
|
45
46
|
block.call(search) if block
|
46
47
|
|
47
|
-
response = @config.http.post
|
48
|
+
response = @config.http.post("#{@config.base_merchant_path}/customers/advanced_search_ids", {:search => search.to_hash})
|
48
49
|
ResourceCollection.new(response) { |ids| _fetch_customers(search, ids) }
|
49
50
|
end
|
50
51
|
|
51
52
|
def transactions(customer_id, options = {})
|
52
|
-
response = @config.http.post
|
53
|
+
response = @config.http.post("#{@config.base_merchant_path}/customers/#{customer_id}/transaction_ids")
|
53
54
|
ResourceCollection.new(response) { |ids| _fetch_transactions(customer_id, ids) }
|
54
55
|
end
|
55
56
|
|
@@ -80,8 +81,8 @@ module Braintree
|
|
80
81
|
]
|
81
82
|
end
|
82
83
|
|
83
|
-
def _do_create(
|
84
|
-
response = @config.http.post
|
84
|
+
def _do_create(path, params=nil) # :nodoc:
|
85
|
+
response = @config.http.post("#{@config.base_merchant_path}#{path}", params)
|
85
86
|
if response[:customer]
|
86
87
|
SuccessfulResult.new(:customer => Customer._new(@gateway, response[:customer]))
|
87
88
|
elsif response[:api_error_response]
|
@@ -91,8 +92,8 @@ module Braintree
|
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
94
|
-
def _do_update(http_verb,
|
95
|
-
response = @config.http.send
|
95
|
+
def _do_update(http_verb, path, params) # :nodoc:
|
96
|
+
response = @config.http.send(http_verb, "#{@config.base_merchant_path}#{path}", params)
|
96
97
|
if response[:customer]
|
97
98
|
SuccessfulResult.new(:customer => Customer._new(@gateway, response[:customer]))
|
98
99
|
elsif response[:api_error_response]
|
@@ -104,13 +105,13 @@ module Braintree
|
|
104
105
|
|
105
106
|
def _fetch_customers(search, ids) # :nodoc:
|
106
107
|
search.ids.in ids
|
107
|
-
response = @config.http.post
|
108
|
+
response = @config.http.post("#{@config.base_merchant_path}/customers/advanced_search", {:search => search.to_hash})
|
108
109
|
attributes = response[:customers]
|
109
110
|
Util.extract_attribute_as_array(attributes, :customer).map { |attrs| Customer._new(@gateway, attrs) }
|
110
111
|
end
|
111
112
|
|
112
113
|
def _fetch_transactions(customer_id, ids) # :nodoc:
|
113
|
-
response = @config.http.post
|
114
|
+
response = @config.http.post("#{@config.base_merchant_path}/customers/#{customer_id}/transactions", :search => {:ids => ids})
|
114
115
|
attributes = response[:credit_card_transactions]
|
115
116
|
Util.extract_attribute_as_array(attributes, :transaction).map do |transaction_attributes|
|
116
117
|
Transaction._new @gateway, transaction_attributes
|