zuora_api 1.9.08 → 1.10.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/zuora_api/login.rb +61 -20
- data/lib/zuora_api/logins/oauth.rb +3 -1
- data/lib/zuora_api/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8cf78cb3b1e25a9394f07c8557a23b8822d4f5cf48839bfad5e6f8e2ab3ad1e7
|
4
|
+
data.tar.gz: 76d6cd10a87cbae7dc3a5898192c9cc1c8683c374ae0008b116bef46ecc79cda
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e53ec1c8acb9ba3d7ce1247f5516162d85095567421082b025fd04117a4cdc463854ec136dc09f3283b09af493a1d68b17cda7c29f0d18d48faabfef949dea5
|
7
|
+
data.tar.gz: 0be11b3df708385da409848b1c953be59cd3efe4c8b658d55dd06e781a9c347df58cd809f32edb88063be4ea6ea11fada13396177ddb08233534afffd3458463
|
data/lib/zuora_api/login.rb
CHANGED
@@ -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': '
|
10
|
+
MIN_Endpoints = {'Test': '114.0', 'Sandbox': '114.0', 'Production': '114.0', 'Performance': '114.0', 'Services': '96.0', 'Unknown': '96.0', 'Staging': '114.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,
|
@@ -46,9 +47,9 @@ module ZuoraAPI
|
|
46
47
|
ZuoraAPI::Exceptions::ZuoraUnexpectedError
|
47
48
|
].freeze
|
48
49
|
|
49
|
-
attr_accessor :region, :url, :wsdl_number, :current_session, :bearer_token, :oauth_session_expires_at, :environment, :status, :errors, :current_error, :user_info, :tenant_id, :tenant_name, :entity_id, :timeout_sleep, :hostname, :zconnect_provider
|
50
|
+
attr_accessor :region, :url, :wsdl_number, :current_session, :bearer_token, :oauth_session_expires_at, :environment, :status, :errors, :current_error, :user_info, :tenant_id, :tenant_name, :entity_id, :entity_identifier, :entity_header_type, :timeout_sleep, :hostname, :zconnect_provider
|
50
51
|
|
51
|
-
def initialize(url: nil, entity_id: nil, session: nil, status: nil, bearer_token: nil, oauth_session_expires_at: nil, **keyword_args)
|
52
|
+
def initialize(url: nil, entity_id: nil, entity_identifier: nil, session: nil, status: nil, bearer_token: nil, oauth_session_expires_at: nil, **keyword_args)
|
52
53
|
raise "URL is nil or empty, but URL is required" if url.nil? || url.empty?
|
53
54
|
# raise "URL is improper. URL must contain zuora.com, zuora.eu, or zuora.na" if /zuora.com|zuora.eu|zuora.na/ === url
|
54
55
|
self.hostname = /(?<=https:\/\/|http:\/\/)(.*?)(?=\/|$)/.match(url)[0] if !/(?<=https:\/\/|http:\/\/)(.*?)(?=\/|$)/.match(url).nil?
|
@@ -62,6 +63,8 @@ module ZuoraAPI
|
|
62
63
|
self.url = url
|
63
64
|
end
|
64
65
|
self.entity_id = get_entity_id(entity_id: entity_id)
|
66
|
+
self.entity_identifier = entity_identifier
|
67
|
+
self.entity_header_type = :entity_id
|
65
68
|
self.errors = Hash.new
|
66
69
|
self.current_session = session
|
67
70
|
self.bearer_token = bearer_token
|
@@ -77,7 +80,7 @@ module ZuoraAPI
|
|
77
80
|
zsession = cookies["ZSession"]
|
78
81
|
begin
|
79
82
|
if !zsession.blank?
|
80
|
-
response = HTTParty.get("https://#{self.hostname}/apps/v1/identity", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json'})
|
83
|
+
response = HTTParty.get("https://#{self.hostname}/apps/v1/identity", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json', "User-Agent" => USER_AGENT})
|
81
84
|
output_json = JSON.parse(response.body)
|
82
85
|
else
|
83
86
|
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present")
|
@@ -93,7 +96,7 @@ module ZuoraAPI
|
|
93
96
|
zsession = cookies["ZSession"]
|
94
97
|
begin
|
95
98
|
if zsession.present?
|
96
|
-
response = HTTParty.get("https://#{self.hostname}/apps/v1/navigation", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json'})
|
99
|
+
response = HTTParty.get("https://#{self.hostname}/apps/v1/navigation", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json', "User-Agent" => USER_AGENT})
|
97
100
|
output_json = JSON.parse(response.body)
|
98
101
|
else
|
99
102
|
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present")
|
@@ -109,7 +112,7 @@ module ZuoraAPI
|
|
109
112
|
zsession = cookies["ZSession"]
|
110
113
|
begin
|
111
114
|
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'})
|
115
|
+
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
116
|
output_json = JSON.parse(response.body)
|
114
117
|
else
|
115
118
|
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present")
|
@@ -125,7 +128,7 @@ module ZuoraAPI
|
|
125
128
|
zsession = cookies["ZSession"]
|
126
129
|
begin
|
127
130
|
if !zsession.blank?
|
128
|
-
response = HTTParty.post("https://#{self.hostname}/apps/v1/navigation/fetch", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json'})
|
131
|
+
response = HTTParty.post("https://#{self.hostname}/apps/v1/navigation/fetch", :headers => {'Cookie' => "ZSession=#{zsession}", 'Content-Type' => 'application/json', "User-Agent" => USER_AGENT})
|
129
132
|
output_json = JSON.parse(response.body)
|
130
133
|
else
|
131
134
|
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("No ZSession cookie present")
|
@@ -140,13 +143,14 @@ module ZuoraAPI
|
|
140
143
|
def reporting_url(path)
|
141
144
|
map = {"US" => {"Sandbox" => "https://zconnectsandbox.zuora.com/api/rest/v1/",
|
142
145
|
"Production" => "https://zconnect.zuora.com/api/rest/v1/",
|
143
|
-
"Test" => "https://
|
146
|
+
"Test" => "https://zconnect-services0001.test.zuora.com/api/rest/v1/",
|
144
147
|
"Staging" => "https://reporting-stg11.zan.svc.auw2.zuora.com/api/rest/v1/",
|
145
148
|
"Performance" => "https://zconnectpt1.zuora.com/api/rest/v1/",
|
146
149
|
"Services" => "https://reporting-svc08.svc.auw2.zuora.com/api/rest/v1/"},
|
147
150
|
"EU" => {"Sandbox" => "https://zconnect.sandbox.eu.zuora.com/api/rest/v1/",
|
148
151
|
"Production" => "https://zconnect.eu.zuora.com/api/rest/v1/",
|
149
|
-
"Services"=> "https://reporting-sbx0000.sbx.aec1.zuora.com/api/rest/v1/"
|
152
|
+
"Services"=> "https://reporting-sbx0000.sbx.aec1.zuora.com/api/rest/v1/",
|
153
|
+
"Test" => "https://zconnect-services0002.test.eu.zuora.com/api/rest/v1/"},
|
150
154
|
"NA" => {"Sandbox" => "https://zconnect.sandbox.na.zuora.com/api/rest/v1/",
|
151
155
|
"Production" => "https://zconnect.na.zuora.com/api/rest/v1/",
|
152
156
|
"Services"=> ""}
|
@@ -177,7 +181,7 @@ module ZuoraAPI
|
|
177
181
|
raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Zuora User ID not provided")
|
178
182
|
end
|
179
183
|
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'})
|
184
|
+
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
185
|
bearer_hash = JSON.parse(bearer_response.body)
|
182
186
|
bearer_token = bearer_hash["access_token"]
|
183
187
|
authorization = "Bearer #{bearer_token}"
|
@@ -185,7 +189,7 @@ module ZuoraAPI
|
|
185
189
|
|
186
190
|
if !authorization.blank? && !user_id.blank? && !entity_ids.blank?
|
187
191
|
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)
|
192
|
+
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
193
|
output_json = JSON.parse(oauth_response.body)
|
190
194
|
if oauth_response.code == 201
|
191
195
|
output_json["clientSecret"] = new_client_secret if !use_api_generated_client_secret
|
@@ -434,12 +438,12 @@ module ZuoraAPI
|
|
434
438
|
end
|
435
439
|
if single_transaction
|
436
440
|
xml["#{ns1}"].CallOptions do
|
437
|
-
xml.useSingleTransaction single_transaction
|
441
|
+
xml["#{ns1}"].useSingleTransaction single_transaction
|
438
442
|
end
|
439
443
|
end
|
440
444
|
if batch_size
|
441
445
|
xml["#{ns1}"].QueryOptions do
|
442
|
-
xml.batchSize batch_size
|
446
|
+
xml["#{ns1}"].batchSize batch_size
|
443
447
|
end
|
444
448
|
end
|
445
449
|
end
|
@@ -454,6 +458,9 @@ module ZuoraAPI
|
|
454
458
|
|
455
459
|
headers.merge!({ 'Content-Type' => "text/xml; charset=utf-8", 'Accept' => 'text/xml'})
|
456
460
|
headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
|
461
|
+
headers['X-Amzn-Trace-Id'] = zuora_track_id if zuora_track_id.present?
|
462
|
+
|
463
|
+
headers["User-Agent"] = USER_AGENT
|
457
464
|
|
458
465
|
request = HTTParty::Request.new(
|
459
466
|
Net::HTTP::Post,
|
@@ -1046,13 +1053,42 @@ module ZuoraAPI
|
|
1046
1053
|
return self.get_file(url: self.aqua_endpoint("file/#{fileId}"))
|
1047
1054
|
end
|
1048
1055
|
|
1056
|
+
def entity_header
|
1057
|
+
if self.entity_header_type == :entity_name && self.entity_identifier.present?
|
1058
|
+
{ "entityName" => self.entity_identifier }
|
1059
|
+
elsif self.entity_id.present?
|
1060
|
+
{ "Zuora-Entity-Ids" => self.entity_id }
|
1061
|
+
else
|
1062
|
+
{}
|
1063
|
+
end
|
1064
|
+
end
|
1065
|
+
|
1066
|
+
def insert_entity_header(destination_headers, lookup_headers: nil)
|
1067
|
+
# The entity header may be added to a place other than where we look for it
|
1068
|
+
lookup_headers = destination_headers if lookup_headers.nil?
|
1069
|
+
|
1070
|
+
entity_header_options = %w(zuora-entity-ids entityid entityname)
|
1071
|
+
# If the customer doesn't supply an entity header, fill it in
|
1072
|
+
if (entity_header_options & lookup_headers.keys.map(&:downcase)).blank?
|
1073
|
+
entity_header = self.entity_header
|
1074
|
+
if entity_header.present?
|
1075
|
+
destination_headers.merge!(entity_header)
|
1076
|
+
entity_header_options_to_exclude =
|
1077
|
+
entity_header_options.
|
1078
|
+
reject { |header| header == entity_header.keys.first&.downcase }
|
1079
|
+
destination_headers.delete_if { |key, _| entity_header_options_to_exclude.include?(key.to_s.downcase) }
|
1080
|
+
end
|
1081
|
+
end
|
1082
|
+
end
|
1083
|
+
|
1049
1084
|
def describe_call(object = nil, log_errors = true)
|
1050
1085
|
tries ||= 2
|
1051
1086
|
|
1052
1087
|
base = self.url.include?(".com") ? self.url.split(".com")[0].concat(".com") : self.url.split(".eu")[0].concat(".eu")
|
1053
1088
|
url = object ? "#{base}/apps/api/describe/#{object}" : "#{base}/apps/api/describe/"
|
1054
|
-
headers =
|
1055
|
-
|
1089
|
+
headers = { "Content-Type" => "text/xml; charset=utf-8" }.merge(self.entity_header)
|
1090
|
+
|
1091
|
+
response = HTTParty.get(url, headers: {"Authorization" => self.get_session(prefix: true, auth_type: :basic), "User-Agent" => USER_AGENT}.merge(headers), :timeout => 130)
|
1056
1092
|
|
1057
1093
|
raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error.present? ? self.current_error : 'Describe call 401', response) if response.code == 401
|
1058
1094
|
|
@@ -1138,12 +1174,13 @@ module ZuoraAPI
|
|
1138
1174
|
authentication_headers = {}
|
1139
1175
|
if z_session
|
1140
1176
|
authentication_headers = {"Authorization" => self.get_session(prefix: true, auth_type: session_type, zuora_track_id: zuora_track_id) }
|
1141
|
-
|
1142
|
-
|
1143
|
-
authentication_headers.delete_if { |key, value| ["entityId", "entityName"].include?(key.to_s) }
|
1144
|
-
end
|
1177
|
+
|
1178
|
+
self.insert_entity_header(authentication_headers, lookup_headers: headers)
|
1145
1179
|
end
|
1146
1180
|
headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
|
1181
|
+
headers['X-Amzn-Trace-Id'] = zuora_track_id if zuora_track_id.present?
|
1182
|
+
|
1183
|
+
headers['User-Agent'] = USER_AGENT
|
1147
1184
|
|
1148
1185
|
modified_headers = {'Content-Type' => "application/json; charset=utf-8"}.merge(authentication_headers).merge(headers)
|
1149
1186
|
|
@@ -1305,10 +1342,14 @@ module ZuoraAPI
|
|
1305
1342
|
http.use_ssl = true if !uri.scheme.nil? && uri.scheme.downcase == 'https'
|
1306
1343
|
if z_session
|
1307
1344
|
headers = headers.merge({"Authorization" => self.get_session(prefix: true)})
|
1308
|
-
|
1345
|
+
|
1346
|
+
self.insert_entity_header(headers)
|
1309
1347
|
end
|
1310
1348
|
|
1311
1349
|
headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
|
1350
|
+
headers['X-Amzn-Trace-Id'] = zuora_track_id if zuora_track_id.present?
|
1351
|
+
|
1352
|
+
headers["User-Agent"] = USER_AGENT
|
1312
1353
|
|
1313
1354
|
response_save = nil
|
1314
1355
|
http.request_get(uri.request_uri, headers) do |response|
|
@@ -32,8 +32,9 @@ module ZuoraAPI
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def get_z_session(debug: false, zuora_track_id: nil)
|
35
|
-
headers = self.
|
35
|
+
headers = self.entity_header
|
36
36
|
headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
|
37
|
+
headers['X-Amzn-Trace-Id'] = zuora_track_id if zuora_track_id.present?
|
37
38
|
output_json, response = self.rest_call(:url => self.rest_endpoint("connections"), :session_type => :bearer, :headers => headers)
|
38
39
|
begin
|
39
40
|
self.current_session = response.headers.to_h['set-cookie'][0].split(';')[0].split('=',2)[1].gsub('%3D', '=')
|
@@ -54,6 +55,7 @@ module ZuoraAPI
|
|
54
55
|
|
55
56
|
headers = { "content-type" => "application/x-www-form-urlencoded" }
|
56
57
|
headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
|
58
|
+
headers['X-Amzn-Trace-Id'] = zuora_track_id if zuora_track_id.present?
|
57
59
|
|
58
60
|
output_json, response = self.rest_call(:method => :post,
|
59
61
|
url: self.rest_endpoint.chomp('v1/').concat("oauth/token"),
|
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.
|
4
|
+
version: 1.10.2
|
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:
|
11
|
+
date: 2022-01-14 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.
|
222
|
+
rubygems_version: 3.2.32
|
223
223
|
signing_key:
|
224
224
|
specification_version: 4
|
225
225
|
summary: Gem that provides easy integration to Zuora
|