zuora_api 1.6.37 → 1.6.38
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/zuora_api/exceptions.rb +30 -14
- data/lib/zuora_api/login.rb +78 -65
- data/lib/zuora_api/logins/basic.rb +11 -11
- data/lib/zuora_api/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db27825f234df0bf22824cd3100d5b4ed5f6565fc46cbbbab742dd62f2b02261
|
4
|
+
data.tar.gz: 298711ae7f8362f91c67c8f66fa3b685e7f8beb44eb3dbc9233225b5e5e6e1e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf541c7e898feec11cc498a81fa1f3eacb9920d8315eee5feca4001ea656de14c71b14fcca73ada4065c80950aa25b490d054b61c59432588d60e8a7fae22eeb
|
7
|
+
data.tar.gz: 2d4f8d1c8c141e3646eb25deefac6acd288ff2e996d73736ce96c8f8d9a3844079bfff08b08f2af2f07cc205fbd870b8896af61bb77b72e97aac68e859627c36
|
data/lib/zuora_api/exceptions.rb
CHANGED
@@ -6,8 +6,8 @@ module ZuoraAPI
|
|
6
6
|
attr_reader :code, :response
|
7
7
|
attr_writer :default_message
|
8
8
|
|
9
|
-
def initialize(message = nil,response=nil
|
10
|
-
@code = code
|
9
|
+
def initialize(message = nil,response=nil)
|
10
|
+
@code = response.present? && response.class.to_s == "HTTParty::Response" ? response.code : nil
|
11
11
|
@message = message
|
12
12
|
@response = response
|
13
13
|
@default_message = "Error with Zuora Session."
|
@@ -22,8 +22,8 @@ module ZuoraAPI
|
|
22
22
|
attr_reader :code, :response, :errors, :successes
|
23
23
|
attr_writer :default_message
|
24
24
|
|
25
|
-
def initialize(message = nil,response=nil,
|
26
|
-
@code = code
|
25
|
+
def initialize(message = nil,response=nil, errors = [], successes = [], *args)
|
26
|
+
@code = response.present? && response.class.to_s == "HTTParty::Response" ? response.code : nil
|
27
27
|
@message = message
|
28
28
|
@response = response
|
29
29
|
@default_message = "Error with Zuora Entity"
|
@@ -40,8 +40,8 @@ module ZuoraAPI
|
|
40
40
|
attr_reader :code, :response, :errors, :successes
|
41
41
|
attr_writer :default_message
|
42
42
|
|
43
|
-
def initialize(message = nil,response=nil,
|
44
|
-
@code = code
|
43
|
+
def initialize(message = nil,response=nil, errors = [], successes = [], *args)
|
44
|
+
@code = response.present? && response.class.to_s == "HTTParty::Response" ? response.code : nil
|
45
45
|
@message = message
|
46
46
|
@response = response
|
47
47
|
@default_message = "Error communicating with Zuora."
|
@@ -58,8 +58,8 @@ module ZuoraAPI
|
|
58
58
|
attr_reader :code, :response
|
59
59
|
attr_writer :default_message
|
60
60
|
|
61
|
-
def initialize(message = nil,response=nil,
|
62
|
-
@code = code
|
61
|
+
def initialize(message = nil,response=nil, *args)
|
62
|
+
@code = response.present? && response.class.to_s == "HTTParty::Response" ? response.code : nil
|
63
63
|
@message = message
|
64
64
|
@response = response
|
65
65
|
@default_message = "Your request limit has been exceeded for zuora."
|
@@ -74,8 +74,24 @@ module ZuoraAPI
|
|
74
74
|
attr_reader :code, :response
|
75
75
|
attr_writer :default_message
|
76
76
|
|
77
|
-
def initialize(message = nil,response=nil,
|
78
|
-
@code = code
|
77
|
+
def initialize(message = nil,response=nil, *args)
|
78
|
+
@code = response.present? && response.class.to_s == "HTTParty::Response" ? response.code : nil
|
79
|
+
@message = message
|
80
|
+
@response = response
|
81
|
+
@default_message = "Operation failed due to lock competition. Please retry"
|
82
|
+
end
|
83
|
+
|
84
|
+
def to_s
|
85
|
+
@message || @default_message
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
class ZuoraDataIntegrity < Error
|
90
|
+
attr_reader :code, :response
|
91
|
+
attr_writer :default_message
|
92
|
+
|
93
|
+
def initialize(message = nil,response=nil, *args)
|
94
|
+
@code = response.present? && response.class.to_s == "HTTParty::Response" ? response.code : nil
|
79
95
|
@message = message
|
80
96
|
@response = response
|
81
97
|
@default_message = "Operation failed due to lock competition. Please retry"
|
@@ -90,8 +106,8 @@ module ZuoraAPI
|
|
90
106
|
attr_reader :code, :response
|
91
107
|
attr_writer :default_message
|
92
108
|
|
93
|
-
def initialize(message = nil,response=nil,
|
94
|
-
@code = code
|
109
|
+
def initialize(message = nil,response=nil, *args)
|
110
|
+
@code = response.present? && response.class.to_s == "HTTParty::Response" ? response.code : nil
|
95
111
|
@message = message
|
96
112
|
@response = response
|
97
113
|
@default_message = "There is a temporary error with zuora system."
|
@@ -106,8 +122,8 @@ module ZuoraAPI
|
|
106
122
|
attr_reader :code, :response
|
107
123
|
attr_writer :default_message
|
108
124
|
|
109
|
-
def initialize(message = nil,response=nil,
|
110
|
-
@code = code
|
125
|
+
def initialize(message = nil,response=nil, *args)
|
126
|
+
@code = response.present? && response.class.to_s == "HTTParty::Response" ? response.code : nil
|
111
127
|
@message = message
|
112
128
|
@response = response
|
113
129
|
@default_message = "Authentication type is not supported by this Login"
|
data/lib/zuora_api/login.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require "httparty"
|
2
2
|
require "nokogiri"
|
3
3
|
require "uri"
|
4
|
+
require 'zuora_api/exceptions'
|
4
5
|
|
5
6
|
module ZuoraAPI
|
6
7
|
class Login
|
@@ -10,7 +11,8 @@ module ZuoraAPI
|
|
10
11
|
XML_SAVE_OPTIONS = Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION
|
11
12
|
CONNECTION_EXCEPTIONS = [Net::OpenTimeout, OpenSSL::SSL::SSLError, Errno::ECONNREFUSED, SocketError, Errno::EHOSTUNREACH]
|
12
13
|
CONNECTION_READ_EXCEPTIONS = [Net::ReadTimeout, Errno::ECONNRESET, Errno::EPIPE]
|
13
|
-
|
14
|
+
ZUORA_API_ERRORS = [ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition, ZuoraAPI::Exceptions::ZuoraAPITemporaryError, ZuoraAPI::Exceptions::ZuoraDataIntegrity]
|
15
|
+
|
14
16
|
attr_accessor :region, :url, :wsdl_number, :current_session, :environment, :status, :errors, :current_error, :user_info, :tenant_id, :tenant_name, :entity_id, :timeout_sleep, :hostname, :zconnect_provider
|
15
17
|
|
16
18
|
def initialize(url: nil, entity_id: nil, session: nil, status: nil, **keyword_args)
|
@@ -36,21 +38,21 @@ module ZuoraAPI
|
|
36
38
|
if !zsession.blank?
|
37
39
|
response = HTTParty.get("https://#{self.hostname}/apps/v1/identity", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json'})
|
38
40
|
output_json = JSON.parse(response.body)
|
39
|
-
elsif
|
40
|
-
code = zconnect_accesstoken.split("#!").last
|
41
|
-
encrypted_token, tenant_id = Base64.decode64(code).split(":")
|
41
|
+
elsif zconnect_accesstoken.present?
|
42
42
|
begin
|
43
|
+
code = zconnect_accesstoken.split("#!").last
|
44
|
+
encrypted_token, tenant_id = Base64.decode64(code).split(":")
|
43
45
|
body = {'token' => encrypted_token}.to_json
|
44
46
|
rescue => ex
|
45
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Invalid ZConnect Cookie"
|
47
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Invalid ZConnect Cookie")
|
46
48
|
end
|
47
49
|
response = HTTParty.post("https://#{self.hostname}/apps/zconnectsession/identity", :body => body, :headers => { 'Content-Type' => 'application/json' })
|
48
50
|
output_json = JSON.parse(response.body)
|
49
51
|
else
|
50
52
|
if zconnect_accesstoken.blank? && cookies.keys.any? { |x| x.include? "ZConnect"}
|
51
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZConnect cookie present matching #{self.hostname}"
|
53
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZConnect cookie present matching #{self.hostname}")
|
52
54
|
else
|
53
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present"
|
55
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present")
|
54
56
|
end
|
55
57
|
end
|
56
58
|
rescue JSON::ParserError => ex
|
@@ -64,17 +66,17 @@ module ZuoraAPI
|
|
64
66
|
zsession = cookies["ZSession"]
|
65
67
|
zconnect_accesstoken = get_zconnect_accesstoken(cookies)
|
66
68
|
begin
|
67
|
-
if
|
69
|
+
if zsession.present?
|
68
70
|
response = HTTParty.get("https://#{self.hostname}/apps/v1/navigation", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json'})
|
69
71
|
output_json = JSON.parse(response.body)
|
70
|
-
elsif
|
72
|
+
elsif zconnect_accesstoken.present?
|
71
73
|
response = HTTParty.get("https://#{self.hostname}/apps/zconnectsession/navigation", :headers => {'Cookie' => "#{self.zconnect_provider}=#{zconnect_accesstoken}",'Content-Type' => 'application/json'})
|
72
74
|
output_json = JSON.parse(response.body)
|
73
75
|
else
|
74
76
|
if zconnect_accesstoken.blank? && cookies.keys.any? { |x| x.include? "ZConnect"}
|
75
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZConnect cookie present matching #{self.hostname}"
|
77
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZConnect cookie present matching #{self.hostname}")
|
76
78
|
else
|
77
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present"
|
79
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present")
|
78
80
|
end
|
79
81
|
end
|
80
82
|
rescue JSON::ParserError => ex
|
@@ -96,9 +98,9 @@ module ZuoraAPI
|
|
96
98
|
output_json = JSON.parse(response.body)
|
97
99
|
else
|
98
100
|
if zconnect_accesstoken.blank? && cookies.keys.any? { |x| x.include? "ZConnect"}
|
99
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZConnect cookie present matching #{self.hostname}"
|
101
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZConnect cookie present matching #{self.hostname}")
|
100
102
|
else
|
101
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present"
|
103
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present")
|
102
104
|
end
|
103
105
|
end
|
104
106
|
rescue JSON::ParserError => ex
|
@@ -120,9 +122,9 @@ module ZuoraAPI
|
|
120
122
|
output_json = JSON.parse(response.body)
|
121
123
|
else
|
122
124
|
if zconnect_accesstoken.blank? && cookies.keys.any? { |x| x.include? "ZConnect"}
|
123
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZConnect cookie present matching #{self.hostname}"
|
125
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZConnect cookie present matching #{self.hostname}")
|
124
126
|
else
|
125
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present"
|
127
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present")
|
126
128
|
end
|
127
129
|
end
|
128
130
|
rescue JSON::ParserError => ex
|
@@ -170,12 +172,12 @@ module ZuoraAPI
|
|
170
172
|
if entity_ids.blank? && cookies["ZuoraCurrentEntity"].present?
|
171
173
|
entity_ids = Array(cookies["ZuoraCurrentEntity"].unpack("a8a4a4a4a12").join('-'))
|
172
174
|
else
|
173
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Zuora Entity ID not provided"
|
175
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Zuora Entity ID not provided")
|
174
176
|
end
|
175
177
|
if user_id.blank? && cookies["Zuora-User-Id"].present?
|
176
178
|
user_id = cookies["Zuora-User-Id"]
|
177
179
|
else
|
178
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Zuora User ID not provided"
|
180
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Zuora User ID not provided")
|
179
181
|
end
|
180
182
|
elsif !client_id.nil? && !client_secret.nil?
|
181
183
|
bearer_response = HTTParty.post("https://#{self.hostname}/oauth/token", :headers => {'Content-Type' => 'application/x-www-form-urlencoded', 'Accept' => 'application/json'}, :body => {'client_id' => client_id, 'client_secret' => URI::encode(client_secret), 'grant_type' => 'client_credentials'})
|
@@ -192,12 +194,12 @@ module ZuoraAPI
|
|
192
194
|
output_json["clientSecret"] = new_client_secret
|
193
195
|
return output_json
|
194
196
|
elsif oauth_response.code == 401 && !oauth_response.message.blank?
|
195
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(output_json["message"],
|
197
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(output_json["message"], oauth_response)
|
196
198
|
else
|
197
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(output_json["error"],
|
199
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(output_json["error"], oauth_response)
|
198
200
|
end
|
199
201
|
else
|
200
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Insufficient credentials provided"
|
202
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Insufficient credentials provided")
|
201
203
|
end
|
202
204
|
end
|
203
205
|
|
@@ -257,7 +259,7 @@ module ZuoraAPI
|
|
257
259
|
if !self.url.blank?
|
258
260
|
if /(?<=\.|\/|-|^)(apisandbox|sandbox)(?=\.|\/|-|$)/ === self.hostname
|
259
261
|
self.environment = 'Sandbox'
|
260
|
-
elsif /(?<=\.|\/|^)(service
|
262
|
+
elsif /(?<=\.|\/|^)(service[\d]*|services[\d]*|ep-edge)(?=\.|\/|$)/ === self.hostname
|
261
263
|
self.environment = 'Services'
|
262
264
|
elsif /(?<=\.|\/|-|^)(pt[\d]*)(?=\.|\/|-|$)/ === self.hostname
|
263
265
|
self.environment = 'Performance'
|
@@ -332,7 +334,7 @@ module ZuoraAPI
|
|
332
334
|
when 'Services'
|
333
335
|
https = /https:\/\/|http:\/\//.match(self.url)[0]
|
334
336
|
host = self.hostname
|
335
|
-
endpoint = "#{https}#{host}/
|
337
|
+
endpoint = "#{https}rest#{host}/v1/#{url}"
|
336
338
|
when 'Staging'
|
337
339
|
endpoint = "https://rest-staging2.zuora.com/v1/".concat(url)
|
338
340
|
when 'Unknown'
|
@@ -389,7 +391,7 @@ module ZuoraAPI
|
|
389
391
|
end
|
390
392
|
end
|
391
393
|
|
392
|
-
def soap_call(ns1: 'ns1', ns2: 'ns2', batch_size: nil, single_transaction: false, debug: false, errors: [ZuoraAPI::Exceptions::ZuoraAPISessionError
|
394
|
+
def soap_call(ns1: 'ns1', ns2: 'ns2', batch_size: nil, single_transaction: false, debug: false, errors: [ZuoraAPI::Exceptions::ZuoraAPISessionError].concat(ZUORA_API_ERRORS), z_session: true, timeout_retry: false, timeout: 120,**keyword_args)
|
393
395
|
tries ||= 2
|
394
396
|
xml = Nokogiri::XML::Builder.new do |xml|
|
395
397
|
xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/",
|
@@ -439,7 +441,7 @@ module ZuoraAPI
|
|
439
441
|
return output_xml, input_xml, response
|
440
442
|
end
|
441
443
|
end
|
442
|
-
rescue
|
444
|
+
rescue *ZUORA_API_ERRORS => ex
|
443
445
|
if errors.include?(ex.class)
|
444
446
|
raise ex
|
445
447
|
else
|
@@ -502,33 +504,39 @@ module ZuoraAPI
|
|
502
504
|
if error.class == String
|
503
505
|
case error
|
504
506
|
when "INVALID_SESSION"
|
505
|
-
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{error}::#{message}",
|
507
|
+
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{error}::#{message}", response)
|
506
508
|
when "REQUEST_EXCEEDED_LIMIT"
|
507
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("#{error}::#{message}",
|
509
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("#{error}::#{message}", response)
|
508
510
|
when "LOCK_COMPETITION"
|
509
|
-
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{error}::#{message}",
|
511
|
+
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{error}::#{message}", response)
|
510
512
|
when "BATCH_FAIL_ERROR"
|
511
513
|
if message.include?("optimistic locking failed")
|
512
|
-
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{error}::#{message}",
|
514
|
+
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{error}::#{message}", response)
|
513
515
|
else
|
514
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{error}::#{message}",
|
516
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{error}::#{message}", response)
|
515
517
|
end
|
516
518
|
when "TEMPORARY_ERROR"
|
517
|
-
raise ZuoraAPI::Exceptions::ZuoraAPITemporaryError.new("#{error}::#{message}",
|
519
|
+
raise ZuoraAPI::Exceptions::ZuoraAPITemporaryError.new("#{error}::#{message}", response)
|
520
|
+
when "INVALID_VALUE"
|
521
|
+
if message.include?("data integrity violation")
|
522
|
+
raise ZuoraAPI::Exceptions::ZuoraDataIntegrity.new("Data Integrity Violation", response)
|
523
|
+
else
|
524
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{error}::#{message}", response)
|
525
|
+
end
|
518
526
|
else
|
519
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{error}::#{message}",
|
527
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{error}::#{message}", response) if error.present?
|
520
528
|
end
|
521
529
|
elsif error.class == Array
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
530
|
+
if error[0].include?("LOCK_COMPETITION") && error.count == 1
|
531
|
+
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new(error.group_by {|v| v}.map {|k,v| "(#{v.size}x) - #{k == "::" ? 'UNKNOWN::No error provided' : k}"}.join(', '), response)
|
532
|
+
else
|
533
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(error.group_by {|v| v}.map {|k,v| "(#{v.size}x) - #{k == "::" ? 'UNKNOWN::No error provided' : k}"}.join(', '), response, error, success)
|
534
|
+
end
|
527
535
|
end
|
528
536
|
end
|
529
|
-
|
537
|
+
|
530
538
|
if response.code == 429
|
531
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("The total number of concurrent requests has exceeded the limit allowed by the system. Please resubmit your request later.",
|
539
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("The total number of concurrent requests has exceeded the limit allowed by the system. Please resubmit your request later.", response)
|
532
540
|
end
|
533
541
|
|
534
542
|
when :JSON
|
@@ -538,58 +546,58 @@ module ZuoraAPI
|
|
538
546
|
codes_array = (body["reasons"] || []).map {|error| error['code']}.compact
|
539
547
|
|
540
548
|
if body['message'] == "No bearer token" && response.code == 400
|
541
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new()
|
549
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Authentication type is not supported by this Login", response)
|
542
550
|
end
|
543
551
|
|
544
552
|
if body['errorMessage']
|
545
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(body['errorMessage'],
|
553
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new(body['errorMessage'], response)
|
546
554
|
end
|
547
555
|
|
548
556
|
if body.dig("reasons").nil? ? false : body.dig("reasons")[0].dig("code") == 90000020
|
549
|
-
raise ZuoraAPI::Exceptions::BadEntityError.new("#{messages_array.join(', ')}",
|
557
|
+
raise ZuoraAPI::Exceptions::BadEntityError.new("#{messages_array.join(', ')}", response)
|
550
558
|
end
|
551
559
|
|
552
560
|
if body['error'] == 'Unauthorized' && body['status'] = 401
|
553
|
-
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{messages_array.join(', ')}",
|
561
|
+
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{messages_array.join(', ')}", response)
|
554
562
|
end
|
555
563
|
#Authentication failed
|
556
564
|
if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(11) || response.code == 401
|
557
|
-
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{messages_array.join(', ')}",
|
565
|
+
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{messages_array.join(', ')}", response)
|
558
566
|
end
|
559
567
|
|
560
568
|
#Zuora REST Create Amendment error #Authentication failed
|
561
569
|
if body["faultcode"].present? && body["faultcode"] == "fns:INVALID_SESSION"
|
562
|
-
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{body['faultstring']}",
|
570
|
+
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{body['faultstring']}", response)
|
563
571
|
end
|
564
572
|
|
565
573
|
#Request exceeded limit
|
566
574
|
if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(70)
|
567
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("#{messages_array.join(', ')}",
|
575
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("#{messages_array.join(', ')}", response)
|
568
576
|
end
|
569
577
|
|
570
578
|
#Locking contention
|
571
579
|
if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(50)
|
572
|
-
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{messages_array.join(', ')}",
|
573
|
-
end
|
580
|
+
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{messages_array.join(', ')}", response)
|
581
|
+
end
|
574
582
|
|
575
583
|
#All Errors catch
|
576
584
|
if codes_array.size > 0
|
577
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{messages_array.join(', ')}",
|
585
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{messages_array.join(', ')}", response)
|
578
586
|
end
|
579
587
|
|
580
588
|
#Zuora REST Query Errors
|
581
589
|
if body["faultcode"].present?
|
582
590
|
case body["faultcode"]
|
583
591
|
when "fns:MALFORMED_QUERY"
|
584
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{body["faultcode"]}::#{body["faultstring"]}",
|
592
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{body["faultcode"]}::#{body["faultstring"]}", response)
|
585
593
|
when "fns:REQUEST_EXCEEDED_LIMIT"
|
586
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("#{body["faultcode"]}::#{body["faultstring"]}",
|
594
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("#{body["faultcode"]}::#{body["faultstring"]}", response)
|
587
595
|
when "fns:LOCK_COMPETITION"
|
588
|
-
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{body["faultcode"]}::#{body["faultstring"]}",
|
596
|
+
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{body["faultcode"]}::#{body["faultstring"]}", response)
|
589
597
|
when "INVALID_SESSION"
|
590
|
-
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{body["faultcode"]}::#{body["faultstring"]}",
|
598
|
+
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{body["faultcode"]}::#{body["faultstring"]}", response)
|
591
599
|
else
|
592
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{body["faultcode"]}::#{body["faultstring"]}",
|
600
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{body["faultcode"]}::#{body["faultstring"]}", response)
|
593
601
|
end
|
594
602
|
end
|
595
603
|
|
@@ -598,7 +606,7 @@ module ZuoraAPI
|
|
598
606
|
(body["Errors"] || []).select { |obj| errors.push(obj["Message"]) }.compact
|
599
607
|
(body["errors"] || []).select { |obj| errors.push(obj["Message"]) }.compact
|
600
608
|
if errors.size > 0
|
601
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{errors.join(", ")}",
|
609
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{errors.join(", ")}", response, errors)
|
602
610
|
end
|
603
611
|
end
|
604
612
|
end
|
@@ -610,22 +618,27 @@ module ZuoraAPI
|
|
610
618
|
|
611
619
|
if all_success.blank? && all_errors.present?
|
612
620
|
error_codes = all_errors.flatten.group_by {|error| error['Code']}.keys.uniq
|
613
|
-
|
614
|
-
|
621
|
+
error_messages = all_errors.flatten.group_by {|error| error['Message']}.keys.uniq
|
622
|
+
if error_codes.size == 1 || error_messages.size == 1
|
623
|
+
if error_codes.first == "LOCK_COMPETITION"
|
624
|
+
raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("Retry Lock Competition", response)
|
625
|
+
elsif error_messages.first.include?("data integrity violation")
|
626
|
+
raise ZuoraAPI::Exceptions::ZuoraDataIntegrity.new("Data Integrity Violation", response)
|
627
|
+
end
|
615
628
|
end
|
616
629
|
end
|
617
630
|
|
618
631
|
if all_errors.size > 0
|
619
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{all_errors.flatten.group_by {|error| error['Message']}.keys.uniq.join(' ')}",
|
632
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{all_errors.flatten.group_by {|error| error['Message']}.keys.uniq.join(' ')}", response, all_errors, all_success)
|
620
633
|
end
|
621
634
|
end
|
622
635
|
|
623
636
|
#All other errors
|
624
637
|
if response.code != 200
|
625
638
|
if response.code == 429
|
626
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("The total number of concurrent requests has exceeded the limit allowed by the system. Please resubmit your request later.",
|
639
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("The total number of concurrent requests has exceeded the limit allowed by the system. Please resubmit your request later.", response)
|
627
640
|
else
|
628
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{response.message}",
|
641
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{response.message}", response)
|
629
642
|
end
|
630
643
|
end
|
631
644
|
end
|
@@ -648,7 +661,7 @@ module ZuoraAPI
|
|
648
661
|
}
|
649
662
|
response = self.rest_call(method: :post, body: params.to_json, url: self.aqua_endpoint("batch-query/"))
|
650
663
|
if(response[0]["id"].nil?)
|
651
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Error in AQuA Process.
|
664
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Error in AQuA Process.", response)
|
652
665
|
end
|
653
666
|
return getFileById(id: response[0]["id"])
|
654
667
|
end
|
@@ -661,7 +674,7 @@ module ZuoraAPI
|
|
661
674
|
response, fullResponse = self.rest_call(method: :get, body: {}, url: self.aqua_endpoint("batch-query/jobs/#{id}"))
|
662
675
|
result = response["batches"][0]["status"]
|
663
676
|
if result == "error"
|
664
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Aqua Error
|
677
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Aqua Error", response)
|
665
678
|
break
|
666
679
|
end
|
667
680
|
end
|
@@ -677,7 +690,7 @@ module ZuoraAPI
|
|
677
690
|
headers = self.entity_id.present? ? {"Zuora-Entity-Ids" => self.entity_id, 'Content-Type' => "text/xml; charset=utf-8"} : {'Content-Type' => "text/xml; charset=utf-8"}
|
678
691
|
response = HTTParty.get(url, headers: {"Authorization" => self.get_session(prefix: true, auth_type: :basic)}.merge(headers), :timeout => 120)
|
679
692
|
|
680
|
-
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error.present? ? self.current_error : 'Describe call 401' ) if response.code == 401
|
693
|
+
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error.present? ? self.current_error : 'Describe call 401', response) if response.code == 401
|
681
694
|
|
682
695
|
output_xml = Nokogiri::XML(response.body)
|
683
696
|
des_hash = Hash.new
|
@@ -730,7 +743,7 @@ module ZuoraAPI
|
|
730
743
|
return des_hash
|
731
744
|
end
|
732
745
|
|
733
|
-
def rest_call(method: :get, body: nil, headers: {}, url: rest_endpoint("catalog/products?pageSize=4"), debug: false, errors: [ZuoraAPI::Exceptions::ZuoraAPISessionError
|
746
|
+
def rest_call(method: :get, body: nil, headers: {}, url: rest_endpoint("catalog/products?pageSize=4"), debug: false, errors: [ZuoraAPI::Exceptions::ZuoraAPISessionError].concat(ZUORA_API_ERRORS), z_session: true, session_type: :basic, timeout_retry: false, timeout: 120, **keyword_args)
|
734
747
|
tries ||= 2
|
735
748
|
|
736
749
|
if self.entity_id.present?
|
@@ -772,7 +785,7 @@ module ZuoraAPI
|
|
772
785
|
return [output_json, response]
|
773
786
|
end
|
774
787
|
end
|
775
|
-
rescue
|
788
|
+
rescue *ZUORA_API_ERRORS => ex
|
776
789
|
if errors.include?(ex.class)
|
777
790
|
raise ex
|
778
791
|
else
|
@@ -823,7 +836,7 @@ module ZuoraAPI
|
|
823
836
|
Rails.logger.debug("Fetch Catalog URL #{url}")
|
824
837
|
output_json, response = self.rest_call(:debug => false, :url => url, :errors => [ZuoraAPI::Exceptions::ZuoraAPISessionError], :timeout_retry => true )
|
825
838
|
if !output_json['success'] =~ (/(true|t|yes|y|1)$/i) || output_json['success'].class != TrueClass
|
826
|
-
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Error Getting Catalog: #{output_json}")
|
839
|
+
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Error Getting Catalog: #{output_json}", response)
|
827
840
|
end
|
828
841
|
output_json["products"].each do |product|
|
829
842
|
catalog_map[product["id"]] = {"productId" => product["id"]}
|
@@ -27,16 +27,16 @@ module ZuoraAPI
|
|
27
27
|
|
28
28
|
input_xml = Nokogiri::XML(request.to_xml(:save_with => XML_SAVE_OPTIONS).strip)
|
29
29
|
input_xml.xpath('//ns1:session', 'ns1' =>'http://api.zuora.com/').children.remove
|
30
|
-
Rails.logger.debug('Connect') {"
|
30
|
+
Rails.logger.debug('Connect') {"SOAP XML: #{input_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}"} if debug
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
Rails.logger.debug('Connect') {"Response Code: #{
|
32
|
+
response_query = HTTParty.post(self.url,:body => request.to_xml(:save_with => XML_SAVE_OPTIONS).strip, :headers => {'Content-Type' => "text/xml; charset=utf-8"}, :timeout => 10)
|
33
|
+
output_xml = Nokogiri::XML(response_query.body)
|
34
|
+
Rails.logger.debug('Connect') {"Response Code: #{response_query.code} SOAP XML: #{output_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}"} if debug
|
35
35
|
|
36
|
-
if
|
36
|
+
if !response_query.success?
|
37
37
|
self.current_session = nil
|
38
|
-
if
|
39
|
-
self.current_error =
|
38
|
+
if output_xml.namespaces.size > 0 && output_xml.xpath('//soapenv:Fault').size > 0
|
39
|
+
self.current_error = output_xml.xpath('//fns:FaultMessage', 'fns' =>'http://fault.api.zuora.com/').text
|
40
40
|
if self.current_error.include?('deactivated')
|
41
41
|
self.status = 'Deactivated'
|
42
42
|
self.current_error = 'Deactivated user login, please check with Zuora tenant administrator'
|
@@ -75,19 +75,19 @@ module ZuoraAPI
|
|
75
75
|
self.errors[:base] = self.current_error
|
76
76
|
else
|
77
77
|
self.status = 'Unknown'
|
78
|
-
self.current_error =
|
78
|
+
self.current_error = output_xml.xpath('//faultstring').text if self.current_error.blank?
|
79
79
|
self.errors[:base] = self.current_error
|
80
80
|
end
|
81
81
|
|
82
82
|
else
|
83
83
|
self.status = 'Unknown'
|
84
|
-
self.current_error =
|
84
|
+
self.current_error = output_xml.xpath('//faultstring').text if self.current_error.blank?
|
85
85
|
self.errors[:base] = self.current_error
|
86
86
|
end
|
87
87
|
else
|
88
88
|
#Username & password combo
|
89
|
-
retrieved_session =
|
90
|
-
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("No session found for api call.") if retrieved_session.blank?
|
89
|
+
retrieved_session = output_xml.xpath('//ns1:Session', 'ns1' =>'http://api.zuora.com/').text
|
90
|
+
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("No session found for api call.", response_query) if retrieved_session.blank?
|
91
91
|
self.status = 'Active'
|
92
92
|
self.current_session = retrieved_session
|
93
93
|
end
|
data/lib/zuora_api/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zuora_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.38
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zuora Strategic Solutions Group
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-05-
|
11
|
+
date: 2019-05-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|