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 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