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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 07b9ce6f6da3f91cb2a8a029a3a383dd7fdb8c8ed72a0b7760b2d6b864646ee5
4
- data.tar.gz: bf0f0aee956840d439f8675fd6f4fc9ec7f26e4e1d425e885ab6fb601835c67f
3
+ metadata.gz: db27825f234df0bf22824cd3100d5b4ed5f6565fc46cbbbab742dd62f2b02261
4
+ data.tar.gz: 298711ae7f8362f91c67c8f66fa3b685e7f8beb44eb3dbc9233225b5e5e6e1e4
5
5
  SHA512:
6
- metadata.gz: d73a30e914434e29fbd4834278f518d1bd71256dde1c14c494d7b4e2157db1e5cb48d7bae209ba093db9aa714e0573c858331e88ad476fcf1ca6c2a197627c6a
7
- data.tar.gz: 2ccc42456bbc58afbc133594c0f6ba4d5df263b64257cbf3efd8cb09572bad1980410c36cfc56788ce69f9e6dd7c533aa16754759bb5c2ee19850bfee6f77d53
6
+ metadata.gz: cf541c7e898feec11cc498a81fa1f3eacb9920d8315eee5feca4001ea656de14c71b14fcca73ada4065c80950aa25b490d054b61c59432588d60e8a7fae22eeb
7
+ data.tar.gz: 2d4f8d1c8c141e3646eb25deefac6acd288ff2e996d73736ce96c8f8d9a3844079bfff08b08f2af2f07cc205fbd870b8896af61bb77b72e97aac68e859627c36
@@ -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, code =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, code =nil, errors = [], successes = [])
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, code =nil, errors = [], successes = [])
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, code =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, code =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, code =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, code =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"
@@ -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 !zconnect_accesstoken.blank?
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", {}, 400)
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}", {}, 400)
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", {}, 400)
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 !zsession.blank?
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 !zconnect_accesstoken.blank?
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}", {}, 400)
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", {}, 400)
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}", {}, 400)
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", {}, 400)
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}", {}, 400)
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", {}, 400)
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", {}, 400)
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", {}, 400)
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"], {}, oauth_response.code)
197
+ raise ZuoraAPI::Exceptions::ZuoraAPIError.new(output_json["message"], oauth_response)
196
198
  else
197
- raise ZuoraAPI::Exceptions::ZuoraAPIError.new(output_json["error"], {}, oauth_response.code)
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", {}, 400)
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|services[\d]*|ep-edge)(?=\.|\/|$)/ === self.hostname
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}/apps/v1/#{url}"
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, ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition], z_session: true, timeout_retry: false, timeout: 120,**keyword_args)
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 ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition => ex
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}", body, response.code )
507
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{error}::#{message}", response)
506
508
  when "REQUEST_EXCEEDED_LIMIT"
507
- raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("#{error}::#{message}", body, response.code)
509
+ raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("#{error}::#{message}", response)
508
510
  when "LOCK_COMPETITION"
509
- raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{error}::#{message}", body, response.code)
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}", body, response.code)
514
+ raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("#{error}::#{message}", response)
513
515
  else
514
- raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{error}::#{message}", body, response.code)
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}", body, response.code)
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}", body, response.code) if error.present?
527
+ raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{error}::#{message}", response) if error.present?
520
528
  end
521
529
  elsif error.class == Array
522
- if error[0].include?("LOCK_COMPETITION") && error.count == 1
523
- raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new(error.group_by {|v| v}.map {|k,v| "(#{v.size}x) - #{k == "::" ? 'UNKNOWN::No error provided' : k}"}.join(', '), body, response.code)
524
- else
525
- raise ZuoraAPI::Exceptions::ZuoraAPIError.new(error.group_by {|v| v}.map {|k,v| "(#{v.size}x) - #{k == "::" ? 'UNKNOWN::No error provided' : k}"}.join(', '), body, response.code, error, success)
526
- end
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.", body, response.code)
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'],body,response.code)
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(', ')}", body, response.code)
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(', ')}", body, response.code)
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(', ')}", body, response.code)
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']}", body, response.code)
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(', ')}", body, response.code)
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(', ')}", body, response.code)
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(', ')}", body, response.code)
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"]}", body, response.code)
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"]}", body, response.code)
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"]}", body, response.code)
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"]}", body, response.code)
598
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{body["faultcode"]}::#{body["faultstring"]}", response)
591
599
  else
592
- raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{body["faultcode"]}::#{body["faultstring"]}", body, response.code)
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(", ")}", body, response.code, errors)
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
- if error_codes.size == 1 && error_codes[0] == "LOCK_COMPETITION"
614
- raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new("Retry Lock Competition", body, response.code)
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(' ')}", body, response.code, all_errors, all_success )
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.", body, response.code)
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}", body, response.code)
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. #{response}")
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: #{response}")
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, ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition], z_session: true, session_type: :basic, timeout_retry: false, timeout: 120, **keyword_args)
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 ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition => ex
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') {"Request Code: #{@response_query.code} SOAP XML: #{input_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}"} if debug
30
+ Rails.logger.debug('Connect') {"SOAP XML: #{input_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}"} if debug
31
31
 
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
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 !@response_query.success?
36
+ if !response_query.success?
37
37
  self.current_session = nil
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
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 = @output_xml.xpath('//faultstring').text if self.current_error.blank?
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 = @output_xml.xpath('//faultstring').text if self.current_error.blank?
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 = @output_xml.xpath('//ns1:Session', 'ns1' =>'http://api.zuora.com/').text
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
@@ -1,3 +1,3 @@
1
1
  module ZuoraAPI
2
- VERSION = "1.6.37"
2
+ VERSION = "1.6.38"
3
3
  end
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.37
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-24 00:00:00.000000000 Z
11
+ date: 2019-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler