zuora_api 1.9.08 → 1.9.09

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: a012abdd5eacb3b9743866d78557e5bb97f52067de92a9aec0e46d45252e190c
4
- data.tar.gz: 005d7186d019c95060f7ec531f0b548382dc6e274e80522d97a79500ee645938
3
+ metadata.gz: a6da8c9fbf54221b62336d0221ada0f53e9d22690b7a6a52cd83f214314b5ba5
4
+ data.tar.gz: be31b09eef19df8b8d1fcbd70b9a11980f125c4eb4d5f96c3259ed516ab88934
5
5
  SHA512:
6
- metadata.gz: 81d8472647c0b37ceee7fadf82610b28deb9b52b35f84740840de68b65f07ded753114e5e86ab6f936740eedf730a9a42f57bdf0e08b91c8a63b711300fb8c5b
7
- data.tar.gz: 2aef7becdbfa2b9b4bdf5d598bd5be23f528f1a09181178df233d8ef218f1c801978d1d1c60d20808b07b7e83981d2bb4dbe1c786a5616977713c064f8fade62
6
+ metadata.gz: d6382ae611e80b38e574357baa771b432c4e554662293e98e4a73ca446c9445264d902f0b604ee071fe9dac6cf6bee4fde8319f0f782975955fdd562cf921b6c
7
+ data.tar.gz: 1008b0e7e533e01b6636cc82e3e79b21c825d095d789d83c73c96142d9de78556c0caa38775aedb97a3b27e43a93f16281680f10a7d988fb005951084a36f75e
@@ -125,12 +125,6 @@ module ZuoraAPI
125
125
  end
126
126
  end
127
127
 
128
- class ZuoraAPIRequestConcurrentLimit < ZuoraAPIRequestLimit
129
- end
130
-
131
- class ZuoraAPIRequestRateLimit < ZuoraAPIRequestLimit
132
- end
133
-
134
128
  class ZuoraAPIUnkownError < Error
135
129
  attr_reader :code, :response
136
130
  attr_writer :default_message
@@ -7,8 +7,9 @@ module ZuoraAPI
7
7
  class Login
8
8
  ENVIRONMENTS = [TEST = 'Test', SANDBOX = 'Sandbox', PRODUCTION = 'Production', PREFORMANCE = 'Preformance', SERVICES = 'Services', UNKNOWN = 'Unknown', STAGING = 'Staging' ]
9
9
  REGIONS = [EU = 'EU', US = 'US', NA = 'NA' ]
10
- MIN_Endpoints = {'Test': '107.0', 'Sandbox': '107.0', 'Production': '107.0', 'Performance': '107.0', 'Services': '96.0', 'Unknown': '96.0', 'Staging': '107.0'}.freeze
10
+ MIN_Endpoints = {'Test': '108.0', 'Sandbox': '108.0', 'Production': '108.0', 'Performance': '108.0', 'Services': '96.0', 'Unknown': '96.0', 'Staging': '108.0'}.freeze
11
11
  XML_SAVE_OPTIONS = Nokogiri::XML::Node::SaveOptions::AS_XML | Nokogiri::XML::Node::SaveOptions::NO_DECLARATION
12
+ USER_AGENT = "Zuora#{ENV['Z_APPLICATION_NAME']&.capitalize}/#{ENV['Z_APPLICATION_VERSION']&.delete('v')}"
12
13
 
13
14
  CONNECTION_EXCEPTIONS = [
14
15
  Net::OpenTimeout,
@@ -29,8 +30,6 @@ module ZuoraAPI
29
30
  ZUORA_API_ERRORS = [
30
31
  ZuoraAPI::Exceptions::ZuoraAPIError,
31
32
  ZuoraAPI::Exceptions::ZuoraAPIRequestLimit,
32
- ZuoraAPI::Exceptions::ZuoraAPIRequestConcurrentLimit,
33
- ZuoraAPI::Exceptions::ZuoraAPIRequestRateLimit,
34
33
  ZuoraAPI::Exceptions::ZuoraAPILockCompetition,
35
34
  ZuoraAPI::Exceptions::ZuoraAPITemporaryError,
36
35
  ZuoraAPI::Exceptions::ZuoraDataIntegrity,
@@ -77,7 +76,7 @@ module ZuoraAPI
77
76
  zsession = cookies["ZSession"]
78
77
  begin
79
78
  if !zsession.blank?
80
- response = HTTParty.get("https://#{self.hostname}/apps/v1/identity", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json'})
79
+ response = HTTParty.get("https://#{self.hostname}/apps/v1/identity", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json', "User-Agent" => USER_AGENT})
81
80
  output_json = JSON.parse(response.body)
82
81
  else
83
82
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present")
@@ -93,7 +92,7 @@ module ZuoraAPI
93
92
  zsession = cookies["ZSession"]
94
93
  begin
95
94
  if zsession.present?
96
- response = HTTParty.get("https://#{self.hostname}/apps/v1/navigation", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json'})
95
+ response = HTTParty.get("https://#{self.hostname}/apps/v1/navigation", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json', "User-Agent" => USER_AGENT})
97
96
  output_json = JSON.parse(response.body)
98
97
  else
99
98
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present")
@@ -109,7 +108,7 @@ module ZuoraAPI
109
108
  zsession = cookies["ZSession"]
110
109
  begin
111
110
  if !zsession.blank?
112
- response = HTTParty.put("https://#{self.hostname}/apps/v1/preference/navigation", :body => state.to_json, :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json'})
111
+ response = HTTParty.put("https://#{self.hostname}/apps/v1/preference/navigation", :body => state.to_json, :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json', "User-Agent" => USER_AGENT})
113
112
  output_json = JSON.parse(response.body)
114
113
  else
115
114
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present")
@@ -125,7 +124,7 @@ module ZuoraAPI
125
124
  zsession = cookies["ZSession"]
126
125
  begin
127
126
  if !zsession.blank?
128
- response = HTTParty.post("https://#{self.hostname}/apps/v1/navigation/fetch", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json'})
127
+ response = HTTParty.post("https://#{self.hostname}/apps/v1/navigation/fetch", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json', "User-Agent" => USER_AGENT})
129
128
  output_json = JSON.parse(response.body)
130
129
  else
131
130
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present")
@@ -140,13 +139,14 @@ module ZuoraAPI
140
139
  def reporting_url(path)
141
140
  map = {"US" => {"Sandbox" => "https://zconnectsandbox.zuora.com/api/rest/v1/",
142
141
  "Production" => "https://zconnect.zuora.com/api/rest/v1/",
143
- "Test" => "https://reporting-sbx.zan.0001.sbx.auw2.zuora.com/api/rest/v1/",
142
+ "Test" => "https://zconnect-services0001.test.zuora.com/api/rest/v1/",
144
143
  "Staging" => "https://reporting-stg11.zan.svc.auw2.zuora.com/api/rest/v1/",
145
144
  "Performance" => "https://zconnectpt1.zuora.com/api/rest/v1/",
146
145
  "Services" => "https://reporting-svc08.svc.auw2.zuora.com/api/rest/v1/"},
147
146
  "EU" => {"Sandbox" => "https://zconnect.sandbox.eu.zuora.com/api/rest/v1/",
148
147
  "Production" => "https://zconnect.eu.zuora.com/api/rest/v1/",
149
- "Services"=> "https://reporting-sbx0000.sbx.aec1.zuora.com/api/rest/v1/"},
148
+ "Services"=> "https://reporting-sbx0000.sbx.aec1.zuora.com/api/rest/v1/",
149
+ "Test" => "https://zconnect-services0002.test.eu.zuora.com/api/rest/v1/"},
150
150
  "NA" => {"Sandbox" => "https://zconnect.sandbox.na.zuora.com/api/rest/v1/",
151
151
  "Production" => "https://zconnect.na.zuora.com/api/rest/v1/",
152
152
  "Services"=> ""}
@@ -177,7 +177,7 @@ module ZuoraAPI
177
177
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Zuora User ID not provided")
178
178
  end
179
179
  elsif !client_id.nil? && !client_secret.nil?
180
- 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'})
180
+ bearer_response = HTTParty.post("https://#{self.hostname}/oauth/token", :headers => {'Content-Type' => 'application/x-www-form-urlencoded', 'Accept' => 'application/json', "User-Agent" => USER_AGENT}, :body => {'client_id' => client_id, 'client_secret' => URI::encode(client_secret), 'grant_type' => 'client_credentials'})
181
181
  bearer_hash = JSON.parse(bearer_response.body)
182
182
  bearer_token = bearer_hash["access_token"]
183
183
  authorization = "Bearer #{bearer_token}"
@@ -185,7 +185,7 @@ module ZuoraAPI
185
185
 
186
186
  if !authorization.blank? && !user_id.blank? && !entity_ids.blank?
187
187
  endpoint = chomp_v1_from_genesis_endpoint ? self.rest_endpoint.chomp("v1/").concat("genesis/clients") : self.rest_endpoint("genesis/clients")
188
- oauth_response = HTTParty.post(endpoint, :headers => {'authorization' => authorization, 'Content-Type' => 'application/json'}, :body => {'clientId' => new_client_id, 'clientSecret' => new_client_secret, 'userId' => user_id, 'entityIds' => entity_ids, 'customAuthorities' => custom_authorities, 'additionalInformation' => {'description' => info_desc, 'name' => info_name}}.to_json)
188
+ oauth_response = HTTParty.post(endpoint, :headers => {'authorization' => authorization, 'Content-Type' => 'application/json', "User-Agent" => USER_AGENT}, :body => {'clientId' => new_client_id, 'clientSecret' => new_client_secret, 'userId' => user_id, 'entityIds' => entity_ids, 'customAuthorities' => custom_authorities, 'additionalInformation' => {'description' => info_desc, 'name' => info_name}}.to_json)
189
189
  output_json = JSON.parse(oauth_response.body)
190
190
  if oauth_response.code == 201
191
191
  output_json["clientSecret"] = new_client_secret if !use_api_generated_client_secret
@@ -434,12 +434,12 @@ module ZuoraAPI
434
434
  end
435
435
  if single_transaction
436
436
  xml["#{ns1}"].CallOptions do
437
- xml.useSingleTransaction single_transaction
437
+ xml["#{ns1}"].useSingleTransaction single_transaction
438
438
  end
439
439
  end
440
440
  if batch_size
441
441
  xml["#{ns1}"].QueryOptions do
442
- xml.batchSize batch_size
442
+ xml["#{ns1}"].batchSize batch_size
443
443
  end
444
444
  end
445
445
  end
@@ -454,6 +454,7 @@ module ZuoraAPI
454
454
 
455
455
  headers.merge!({ 'Content-Type' => "text/xml; charset=utf-8", 'Accept' => 'text/xml'})
456
456
  headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
457
+ headers["User-Agent"] = USER_AGENT
457
458
 
458
459
  request = HTTParty::Request.new(
459
460
  Net::HTTP::Post,
@@ -613,7 +614,10 @@ module ZuoraAPI
613
614
  case response.code
614
615
  when 504
615
616
  raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received 504 from 'https://#{rest_domain(endpoint: request_uri)}'", response)
616
- when 401, 429
617
+ when 429
618
+ 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)
619
+ when 401
620
+
617
621
  else
618
622
  if body.class == Hash
619
623
  case request_path
@@ -630,21 +634,6 @@ module ZuoraAPI
630
634
  when :SOAP
631
635
  error, success, message = get_soap_error_and_message(body)
632
636
 
633
- if response.code == 429
634
- if message.to_s.downcase.include?('concurrent')
635
- raise ZuoraAPI::Exceptions::ZuoraAPIRequestConcurrentLimit.new(
636
- "The total number of concurrent requests has exceeded the limit allowed by the system. " \
637
- "Please resubmit your request later.",
638
- response
639
- )
640
- else
641
- raise ZuoraAPI::Exceptions::ZuoraAPIRequestRateLimit.new(
642
- "Rate limiting. Please resubmit your request later.",
643
- response
644
- )
645
- end
646
- end
647
-
648
637
  if body.xpath('//fns:LoginFault', 'fns' =>'http://fault.api.zuora.com/').present?
649
638
  raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(message, response)
650
639
  end
@@ -737,12 +726,7 @@ module ZuoraAPI
737
726
  codes_array = codes_array.push(body.dig("error", 'code')).compact
738
727
  end
739
728
 
740
- body_message = body.fetch('message', '').downcase
741
- if body_message.include?('rate limit exceeded')
742
- raise ZuoraAPI::Exceptions::ZuoraAPIRequestRateLimit.new("The total number of requests has exceeded the rate limit allowed by the system. Please resubmit your request later.", response)
743
- end
744
-
745
- if body_message.include?('request exceeded limit')
729
+ if body['message'] == 'request exceeded limit'
746
730
  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)
747
731
  end
748
732
 
@@ -814,7 +798,7 @@ module ZuoraAPI
814
798
 
815
799
  #Request exceeded limit
816
800
  if codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(70)
817
- raise ZuoraAPI::Exceptions::ZuoraAPIRequestConcurrentLimit.new("#{messages_array.join(', ')}", response)
801
+ raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new("#{messages_array.join(', ')}", response)
818
802
  end
819
803
 
820
804
  #All Errors catch
@@ -822,10 +806,6 @@ module ZuoraAPI
822
806
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new("#{messages_array.join(', ')}", response)
823
807
  end
824
808
 
825
- if response.code == 429
826
- 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)
827
- end
828
-
829
809
  #Zuora REST Query Errors
830
810
  if body["faultcode"].present?
831
811
  raise_errors_helper(error: body["faultcode"], message: body["faultstring"], response: response)
@@ -961,11 +941,7 @@ module ZuoraAPI
961
941
  when /.*INVALID_SESSION/
962
942
  raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(message, response, errors, success)
963
943
  when /.*REQUEST_EXCEEDED_LIMIT/
964
- if message.to_s.downcase.include?('concurrent')
965
- raise ZuoraAPI::Exceptions::ZuoraAPIRequestConcurrentLimit.new(message, response, errors, success)
966
- else
967
- raise ZuoraAPI::Exceptions::ZuoraAPIRequestRateLimit.new(message, response, errors, success)
968
- end
944
+ raise ZuoraAPI::Exceptions::ZuoraAPIRequestLimit.new(message, response, errors, success)
969
945
  when /.*LOCK_COMPETITION/
970
946
  raise ZuoraAPI::Exceptions::ZuoraAPILockCompetition.new(message, response, errors, success)
971
947
  when /.*BATCH_FAIL_ERROR/
@@ -1052,7 +1028,7 @@ module ZuoraAPI
1052
1028
  base = self.url.include?(".com") ? self.url.split(".com")[0].concat(".com") : self.url.split(".eu")[0].concat(".eu")
1053
1029
  url = object ? "#{base}/apps/api/describe/#{object}" : "#{base}/apps/api/describe/"
1054
1030
  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"}
1055
- response = HTTParty.get(url, headers: {"Authorization" => self.get_session(prefix: true, auth_type: :basic)}.merge(headers), :timeout => 130)
1031
+ response = HTTParty.get(url, headers: {"Authorization" => self.get_session(prefix: true, auth_type: :basic), "User-Agent" => USER_AGENT}.merge(headers), :timeout => 130)
1056
1032
 
1057
1033
  raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error.present? ? self.current_error : 'Describe call 401', response) if response.code == 401
1058
1034
 
@@ -1144,6 +1120,7 @@ module ZuoraAPI
1144
1120
  end
1145
1121
  end
1146
1122
  headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
1123
+ headers['User-Agent'] = USER_AGENT
1147
1124
 
1148
1125
  modified_headers = {'Content-Type' => "application/json; charset=utf-8"}.merge(authentication_headers).merge(headers)
1149
1126
 
@@ -1309,6 +1286,7 @@ module ZuoraAPI
1309
1286
  end
1310
1287
 
1311
1288
  headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
1289
+ headers["User-Agent"] = USER_AGENT
1312
1290
 
1313
1291
  response_save = nil
1314
1292
  http.request_get(uri.request_uri, headers) do |response|
@@ -1423,56 +1401,6 @@ module ZuoraAPI
1423
1401
  raise
1424
1402
  end
1425
1403
 
1426
- def create_data_source_export(query: "", encrypted: false, zip: true, z_track_id: "")
1427
- begin
1428
- output_xml, input_xml = self.soap_call(debug: false, timeout_retry: true, zuora_track_id: z_track_id) do |xml|
1429
- xml['ns1'].create do
1430
- xml['ns1'].zObjects('xsi:type' => "ns2:Export") do
1431
- xml['ns2'].Format 'csv'
1432
- xml['ns2'].Zip zip
1433
- xml['ns2'].Name 'googman'
1434
- xml['ns2'].Query query
1435
- xml['ns2'].Encrypted encrypted
1436
- end
1437
- end
1438
- end
1439
-
1440
- return output_xml.xpath('//ns1:Id', 'ns1' =>'http://api.zuora.com/').text
1441
- rescue Exception => ex
1442
- raise ex.class.new("#{z_track_id} #{ex.message}")
1443
- end
1444
- end
1445
-
1446
- def check_export_status(export_id: "")
1447
- begin
1448
- response, full_response = self.rest_call(method: :get,url: self.rest_endpoint("object/export/#{export_id}"))
1449
-
1450
- return full_response.parsed_response
1451
- rescue Exception => ex
1452
- raise ex
1453
- end
1454
- end
1455
-
1456
- def get_export_file(file_id: "", extract: true, zip: true)
1457
- begin
1458
- export_file_path = self.get_file(:url => self.rest_endpoint("files/#{file_id}")).path
1459
-
1460
- if extract && zip
1461
- require "zip"
1462
- new_path = export_file_path.partition('.zip').first
1463
- zipped = Zip::File.open(export_file_path)
1464
- file_handle = zipped.entries.first
1465
- file_handle.extract(new_path)
1466
- File.delete(export_file_path)
1467
- return new_path
1468
- else
1469
- return export_file_path
1470
- end
1471
- rescue Exception => ex
1472
- raise ex
1473
- end
1474
- end
1475
-
1476
1404
  def getDataSourceExport(query, extract: true, encrypted: false, zip: true, z_track_id: "")
1477
1405
  tries ||= 3
1478
1406
 
@@ -1,3 +1,3 @@
1
1
  module ZuoraAPI
2
- VERSION = "1.9.08"
2
+ VERSION = "1.9.09"
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.9.08
4
+ version: 1.9.09
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: 2021-05-26 00:00:00.000000000 Z
11
+ date: 2021-08-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -219,7 +219,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
219
219
  - !ruby/object:Gem::Version
220
220
  version: '0'
221
221
  requirements: []
222
- rubygems_version: 3.2.15
222
+ rubygems_version: 3.2.22
223
223
  signing_key:
224
224
  specification_version: 4
225
225
  summary: Gem that provides easy integration to Zuora