zuora_api 1.6.37 → 1.6.38
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/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
|