zuora_api 1.7.66c → 1.7.66i

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: 461c544727a1c87da9074597e00bca16191713827f05faef4f93bd0bb871c0ce
4
- data.tar.gz: 6214b8eea0900f6db43a670be948d52dcc769233eeccf9202619f803c9a1275b
3
+ metadata.gz: d9abc05b9cc822f673afd3df5ab42267a5b0507c5af115d784cbe8b148ee7eda
4
+ data.tar.gz: fdf4bac3b2f9f6999406ebbe9e96ca80fb07297c5d915ff2fac280225adb486f
5
5
  SHA512:
6
- metadata.gz: 8631be8f69c675f66274d3b902ea61a1d06a0748b2fe8d626986784b6d7430d369180b4e6573f4272bbef1b5e200d306dab08897882987dd89a4512b7058968f
7
- data.tar.gz: 2e201fe035b941a6a499df4e336e31dc287fca7b6bdb779ad0cea5ecfac5dbf3a8fc482efebaeb67ea75ed3a23018958a1db090ccccc996685c27aab13383ca8
6
+ metadata.gz: ac941b6f8d7c790ad3485690a15f756fba277adc39e594153e96cfb21ce3997e181c2dc4761621a7837f7be2072fc3da3ce0c613ef3b6ba4aaa47aaa3eb14fe4
7
+ data.tar.gz: 496c6f87369ef131c9a4b8e9f3fdb3e1896c3b73a9784174788234dbf2d55c9ed4a46908bac9ea924a7728ebdf64818c635bda93951b0c9781cfd5f81754b960
@@ -1,4 +1,4 @@
1
- image: ruby:2.6
1
+ image: ruby:2.7
2
2
  stages:
3
3
  - setup
4
4
  - test
@@ -35,6 +35,7 @@ rspec-testing:
35
35
  script:
36
36
  - bundle install
37
37
  - rspec
38
+ coverage: '/\(\d+.\d+\%\) covered/'
38
39
 
39
40
  rubygems-deploy:
40
41
  stage: deploy
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
1
  source 'https://rubygems.org'
2
-
2
+ ruby "2.7.1"
3
3
  # Specify your gem's dependencies in zuora.gemspec
4
4
  gemspec
@@ -40,6 +40,19 @@ module ZuoraAPI
40
40
  def to_s
41
41
  @message || @default_message
42
42
  end
43
+
44
+ def parse_message(message)
45
+ case message
46
+ when /^Invalid Oauth Client Id$/, /^Unable to generate token.$/
47
+ @message = "Invalid login, please check client ID and Client Secret or URL endpoint"
48
+ when /^Forbidden$/
49
+ @message = "The user associated to OAuth credential set has been deactivated."
50
+ when /^Invalid login. User name and password do not match.$/
51
+ @message = "Invalid login, please check username and password or URL endpoint"
52
+ else
53
+ @message = message
54
+ end
55
+ end
43
56
  end
44
57
 
45
58
  class BadEntityError < Error
@@ -374,8 +374,8 @@ module ZuoraAPI
374
374
  return domain ? endpoint.concat(prefix).concat(url) : prefix.concat(url)
375
375
  end
376
376
 
377
- def rest_domain
378
- return URI(self.rest_endpoint).host
377
+ def rest_domain(endpoint: self.rest_endpoint)
378
+ return URI(endpoint).host
379
379
  end
380
380
 
381
381
  def fileURL(url="")
@@ -387,10 +387,41 @@ module ZuoraAPI
387
387
  end
388
388
 
389
389
  def new_session(auth_type: :basic, debug: false, zuora_track_id: nil)
390
+ tries ||= 2
391
+ yield
392
+
393
+ rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
394
+ self.status = 'Inactive/Invalid'
395
+ self.current_error = ex.message
396
+ raise
397
+ rescue ZuoraAPI::Exceptions::ZuoraAPIError => ex
398
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(ex.message, ex.response)
399
+
400
+ rescue ZuoraAPI::Exceptions::ZuoraAPIInternalServerError => ex
401
+ raise ex if tries.zero?
402
+
403
+ tries -= 1
404
+ sleep(self.timeout_sleep)
405
+ retry
406
+
407
+ rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
408
+ self.log(location: "BasicLogin", exception: ex, message: "Timed out", level: :error)
409
+
410
+ self.current_error = "Request timed out. Try again"
411
+ self.status = 'Timeout'
412
+
413
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error)
414
+
415
+ rescue EOFError
416
+ if self.url.match?(/.*services\d{1,}.zuora.com*/)
417
+ self.current_error = "Services tenant '#{self.url.scan(/.*\/\/(services\d{1,}).zuora.com*/).last.first}' is no longer available."
418
+ self.status = 'Not Available'
419
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error)
420
+ end
421
+
390
422
  end
391
423
 
392
424
  def get_session(prefix: false, auth_type: :basic, zuora_track_id: nil)
393
- Rails.logger.debug("Get session for #{auth_type} - #{self.class.to_s}") if Rails.env.to_s == 'development'
394
425
  case auth_type
395
426
  when :basic
396
427
  if self.current_session.blank?
@@ -399,14 +430,13 @@ module ZuoraAPI
399
430
  if self.bearer_token.blank? || self.oauth_expired?
400
431
  self.new_session(auth_type: :bearer, zuora_track_id: zuora_track_id)
401
432
  end
402
- self.get_z_session(zuora_track_id: zuora_track_id) if self.status == 'Active'
433
+ self.get_z_session(zuora_track_id: zuora_track_id)
403
434
  when 'ZuoraAPI::Basic'
404
435
  self.new_session(auth_type: :basic, zuora_track_id: zuora_track_id)
405
436
  else
406
437
  self.new_session(auth_type: :basic, zuora_track_id: zuora_track_id)
407
438
  end
408
439
  end
409
- raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error) if self.status != 'Active'
410
440
  return prefix ? "ZSession #{self.current_session}" : self.current_session.to_s
411
441
  when :bearer
412
442
  case self.class.to_s
@@ -419,8 +449,6 @@ module ZuoraAPI
419
449
  else
420
450
  raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Unknown Login, does not support Authentication of Type: #{auth_type}")
421
451
  end
422
-
423
- raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error) if self.status != 'Active'
424
452
  return prefix ? "Bearer #{self.bearer_token}" : self.bearer_token.to_s
425
453
  end
426
454
  end
@@ -428,16 +456,18 @@ module ZuoraAPI
428
456
  def soap_call(
429
457
  ns1: 'ns1',
430
458
  ns2: 'ns2',
431
- batch_size: nil,
459
+ batch_size: nil,
460
+ headers: {},
432
461
  single_transaction: false,
433
462
  debug: false,
434
463
  zuora_track_id: nil,
435
464
  errors: [ZuoraAPI::Exceptions::ZuoraAPISessionError].concat(ZUORA_API_ERRORS),
436
465
  z_session: true,
437
466
  timeout_retry: false,
438
- timeout: 120,
467
+ timeout: 130,
439
468
  timeout_sleep_interval: self.timeout_sleep,
440
469
  output_exception_messages: true,
470
+ skip_session: false,
441
471
  **keyword_args)
442
472
  tries ||= 2
443
473
  xml = Nokogiri::XML::Builder.new do |xml|
@@ -447,8 +477,10 @@ module ZuoraAPI
447
477
  'xmlns:api' => "http://api.zuora.com/",
448
478
  "xmlns:#{ns1}" => "http://api.zuora.com/") do
449
479
  xml['SOAP-ENV'].Header do
450
- xml["#{ns1}"].SessionHeader do
451
- xml["#{ns1}"].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: zuora_track_id)
480
+ if !skip_session
481
+ xml["#{ns1}"].SessionHeader do
482
+ xml["#{ns1}"].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: zuora_track_id)
483
+ end
452
484
  end
453
485
  if single_transaction
454
486
  xml["#{ns1}"].CallOptions do
@@ -466,12 +498,11 @@ module ZuoraAPI
466
498
  end
467
499
  end
468
500
  end
469
-
470
501
  input_xml = Nokogiri::XML(xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip)
471
502
  input_xml.xpath('//ns1:session', 'ns1' =>'http://api.zuora.com/').children.remove
472
503
  Rails.logger.debug("Request SOAP XML: #{input_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}") if debug
473
504
 
474
- headers = { 'Content-Type' => "text/xml; charset=utf-8", 'Accept' => 'text/xml'}
505
+ headers.merge!({ 'Content-Type' => "text/xml; charset=utf-8", 'Accept' => 'text/xml'})
475
506
  headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
476
507
 
477
508
  request = HTTParty::Request.new(
@@ -488,7 +519,11 @@ module ZuoraAPI
488
519
  Rails.logger.debug("Response SOAP XML: #{output_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}") if debug
489
520
 
490
521
  raise_errors(type: :SOAP, body: output_xml, response: response)
522
+
523
+ return output_xml, input_xml, response
524
+
491
525
  rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
526
+ raise if skip_session
492
527
  if !tries.zero? && z_session
493
528
  tries -= 1
494
529
  Rails.logger.debug("SOAP Call - Session Invalid")
@@ -513,24 +548,20 @@ module ZuoraAPI
513
548
  return output_xml, input_xml, response
514
549
 
515
550
  rescue *CONNECTION_EXCEPTIONS => ex
516
- if tries.zero?
517
- if output_exception_messages
518
- if Rails.logger.class.to_s == "Ougai::Logger"
519
- Rails.logger.error("SOAP Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
520
- else
521
- Rails.logger.error("SOAP Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
522
- end
523
- end
524
- raise ex
551
+ if !tries.zero?
552
+ tries -= 1
553
+ self.log(location: "SOAP Call", exception: ex, message: "Timed out will retry after #{timeout_sleep_interval} seconds", level: :debug)
554
+ sleep(timeout_sleep_interval)
555
+ retry
525
556
  end
526
557
 
527
- tries -= 1
528
- sleep(timeout_sleep_interval)
529
- retry
558
+ self.log(location: "SOAP Call", exception: ex, message: "Timed out", level: :error) if output_exception_messages
559
+ raise ex
560
+
530
561
  rescue *CONNECTION_READ_EXCEPTIONS => ex
531
562
  if !tries.zero?
532
563
  tries -= 1
533
-
564
+ self.log(location: "SOAP Call", exception: ex, message: "Timed out will retry after #{timeout_sleep_interval} seconds", level: :debug)
534
565
  if ex.is_a?(Errno::ECONNRESET) && ex.message.include?('SSL_connect')
535
566
  retry
536
567
  elsif timeout_retry
@@ -539,19 +570,79 @@ module ZuoraAPI
539
570
  end
540
571
  end
541
572
 
542
- if output_exception_messages
543
- if Rails.logger.class.to_s == "Ougai::Logger"
544
- Rails.logger.error("SOAP Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
545
- else
546
- Rails.logger.error("SOAP Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
547
- end
548
- end
549
- raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}", nil, request) if ex.instance_of?(Net::ReadTimeout)
573
+ self.log(location: "SOAP Call", exception: ex, message: "Timed out", level: :error) if output_exception_messages
574
+ ex = ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from 'https://#{rest_domain(endpoint: url)}'", nil, request) if ex.instance_of?(Net::ReadTimeout)
550
575
  raise ex
576
+
551
577
  rescue => ex
552
578
  raise ex
553
- else
554
- return output_xml, input_xml, response
579
+ ensure
580
+ self.error_logger(ex) if defined?(ex) && Rails.logger.class.to_s == "Ougai::Logger"
581
+ end
582
+
583
+ def error_logger(ex)
584
+ exception_args = Rails.logger.with_fields.merge(self.exception_args(ex))
585
+ case ex
586
+ when ZuoraAPI::Exceptions::ZuoraAPIUnkownError, ZuoraAPI::Exceptions::ZuoraDataIntegrity
587
+ Rails.logger.error('Zuora Unknown/Integrity Error', ex, exception_args)
588
+ when ZuoraAPI::Exceptions::ZuoraAPIRequestLimit
589
+ Rails.logger.info('Zuora APILimit Reached', exception_args)
590
+ when *(ZuoraAPI::Login::ZUORA_API_ERRORS-ZuoraAPI::Login::ZUORA_SERVER_ERRORS)
591
+ #Rails.logger.debug('Zuora API Error', ex, self.exception_args(ex))
592
+ when *ZuoraAPI::Login::ZUORA_SERVER_ERRORS
593
+ Rails.logger.error('Zuora Server Error', ex, exception_args)
594
+ end
595
+ end
596
+
597
+ def log(location: "Rest Call", exception: nil, message: "Timed out will retry after #{self.timeout_sleep} seconds", level: :info )
598
+ level = :debug if ![:debug, :info, :warn, :error, :fatal].include?(level)
599
+ if Rails.logger.class.to_s == "Ougai::Logger"
600
+ Rails.logger.send(level.to_sym, "#{location} - #{message}", exception)
601
+ else
602
+ Rails.logger.send(level.to_sym, "#{location} - #{exception.class} #{message}")
603
+ end
604
+ end
605
+
606
+ def exception_args(ex)
607
+ args = {}
608
+ if ex.class == ZuoraAPI::Exceptions::ZuoraAPIRequestLimit
609
+ args.merge!({
610
+ zuora_trace_id: ex.response.headers["zuora-request-id"],
611
+ zuora_track_id: ex.response.request.options[:headers]["Zuora-Track-Id"]
612
+ })
613
+ elsif defined?(ex.response) && ex.response.present?
614
+ args.merge!({
615
+ request: {
616
+ path: ex.response.request.path.to_s,
617
+ method: ex.response.request.http_method.to_s.split("Net::HTTP::").last.upcase,
618
+ params: ex.response.request.raw_body.to_s,
619
+ headers: ex.response.request.options[:headers].map{|k,v| [k.to_s, k.to_s.downcase.strip == "authorization" ? "VALUE FILTERED" : v]}.to_h.to_s,
620
+ },
621
+ response: {
622
+ status: ex.response.code,
623
+ params: ex.response.body.to_s,
624
+ headers: ex.response.headers.to_s,
625
+ },
626
+ zuora_trace_id: ex.response.headers["zuora-request-id"],
627
+ zuora_track_id: ex.response.request.options[:headers]["Zuora-Track-Id"],
628
+ })
629
+ elsif defined?(ex.request) && ex.request.present?
630
+ args.merge!({
631
+ request: {
632
+ path: ex.request.path.to_s,
633
+ method: ex.request.http_method.to_s.split("Net::HTTP::").last.upcase,
634
+ params: ex.request.options[:body],
635
+ headers: ex.request.options[:headers].map{|k,v| [k.to_s, k.to_s.downcase.strip == "authorization" ? "VALUE FILTERED" : v]}.to_h.to_s
636
+ }
637
+ })
638
+ args.merge!({
639
+ zuora_track_id: ex.request.options[:headers]["Zuora-Track-Id"]
640
+ }) if ex.request.options[:headers]["Zuora-Track-Id"].present?
641
+ end
642
+ rescue => ex
643
+ Rails.logger.error("Failed to create exception arguments", ex, args)
644
+ ensure
645
+ return args
555
646
  end
556
647
 
557
648
  def raise_errors(type: :SOAP, body: nil, response: nil)
@@ -568,13 +659,13 @@ module ZuoraAPI
568
659
  end
569
660
 
570
661
  if [502,503].include?(response.code)
571
- raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new("Received #{response.code} from #{request_uri}", response)
662
+ raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new("Received #{response.code} from 'https://#{rest_domain(endpoint: request_uri)}'", response)
572
663
  end
573
664
 
574
665
  # Check failure response code
575
666
  case response.code
576
667
  when 504
577
- raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received 504 from #{request_uri}", response)
668
+ raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received 504 from 'https://#{rest_domain(endpoint: request_uri)}'", response)
578
669
  when 429
579
670
  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)
580
671
  when 401
@@ -595,6 +686,10 @@ module ZuoraAPI
595
686
  when :SOAP
596
687
  error, success, message = get_soap_error_and_message(body)
597
688
 
689
+ if body.xpath('//fns:LoginFault', 'fns' =>'http://fault.api.zuora.com/').present?
690
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(message, response)
691
+ end
692
+
598
693
  if body.xpath('//ns1:queryResponse', 'ns1' => 'http://api.zuora.com/').present? &&
599
694
  body.xpath(
600
695
  '//ns1:records[@xsi:type="ns2:Export"]',
@@ -699,7 +794,11 @@ module ZuoraAPI
699
794
  end
700
795
 
701
796
  if body['error'] == 'Unauthorized' && body['status'] == 401
702
- raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{messages_array.join(', ')}", response)
797
+ if body['message'].present?
798
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(body['message'], response)
799
+ else
800
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("#{messages_array.join(', ')}", response)
801
+ end
703
802
  end
704
803
  #Authentication failed
705
804
  if (codes_array.map{|code| code.to_s.slice(6,7).to_i}.include?(11) || response.code == 401) && !codes_array.include?(422)
@@ -826,6 +925,8 @@ module ZuoraAPI
826
925
  raise ZuoraAPI::Exceptions::ZuoraAPIConnectionTimeout.new(error_message, response)
827
926
  when /Client sent a bad request./, /Bad Request/, /403 Forbidden/
828
927
  raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(error_message, response)
928
+ when /414 Request-URI Too Large/
929
+ raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Request URL is too long", response)
829
930
  else
830
931
  raise ZuoraAPI::Exceptions::ZuoraAPIInternalServerError.new(error_message, response)
831
932
  end
@@ -955,7 +1056,7 @@ module ZuoraAPI
955
1056
  base = self.url.include?(".com") ? self.url.split(".com")[0].concat(".com") : self.url.split(".eu")[0].concat(".eu")
956
1057
  url = object ? "#{base}/apps/api/describe/#{object}" : "#{base}/apps/api/describe/"
957
1058
  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"}
958
- response = HTTParty.get(url, headers: {"Authorization" => self.get_session(prefix: true, auth_type: :basic)}.merge(headers), :timeout => 120)
1059
+ response = HTTParty.get(url, headers: {"Authorization" => self.get_session(prefix: true, auth_type: :basic)}.merge(headers), :timeout => 130)
959
1060
 
960
1061
  raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error.present? ? self.current_error : 'Describe call 401', response) if response.code == 401
961
1062
 
@@ -988,35 +1089,31 @@ module ZuoraAPI
988
1089
  end
989
1090
  des_hash[:related_objects] = output_xml.xpath(".//related-objects").xpath(".//object").map{ |x| [x.xpath(".//name").text.to_sym, [ [:url, x.attributes["href"].value], [:label, x.xpath(".//name").text ] ].to_h] }.to_h
990
1091
  end
1092
+
1093
+ return des_hash
991
1094
  rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
992
- if tries.zero?
993
- if log_errors
994
- if Rails.logger.class.to_s == "Ougai::Logger"
995
- Rails.logger.error("Describe - Timed out will retry after #{self.timeout_sleep} seconds", ex)
996
- else
997
- Rails.logger.error("Describe - #{ex.class} Timed out will retry after #{self.timeout_sleep} seconds")
998
- end
999
- end
1000
- raise ex
1095
+ if !tries.zero?
1096
+ tries -= 1
1097
+ self.log(location: "Describe", exception: ex, message: "Timed out will retry after #{self.timeout_sleep} seconds", level: :debug)
1098
+ sleep(self.timeout_sleep)
1099
+ retry
1001
1100
  end
1002
1101
 
1003
- tries -= 1
1004
- sleep(self.timeout_sleep)
1005
- retry
1102
+ self.log(location: "Describe", exception: ex, message: "Timed out", level: :error) if log_errors
1103
+ raise ex
1104
+
1006
1105
  rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
1007
1106
  if !tries.zero? && self.status == 'Active'
1008
1107
  tries -= 1
1009
1108
  Rails.logger.debug("Describe session expired. Starting new session.")
1010
1109
  self.new_session
1011
1110
  retry
1012
- else
1013
- Rails.logger.error("Describe session expired. Starting new session.") if log_errors
1014
- raise ex
1015
1111
  end
1112
+
1113
+ Rails.logger.error("Describe session expired. Starting new session.") if log_errors
1114
+ raise ex
1016
1115
  rescue => ex
1017
1116
  raise ex
1018
- else
1019
- return des_hash
1020
1117
  end
1021
1118
 
1022
1119
  def rest_call(
@@ -1029,11 +1126,12 @@ module ZuoraAPI
1029
1126
  z_session: true,
1030
1127
  session_type: :basic,
1031
1128
  timeout_retry: false,
1032
- timeout: 120,
1129
+ timeout: 130,
1033
1130
  timeout_sleep_interval: self.timeout_sleep,
1034
1131
  multipart: false,
1035
1132
  stream_body: false,
1036
1133
  output_exception_messages: true,
1134
+ zuora_track_id: nil,
1037
1135
  **keyword_args,
1038
1136
  &block
1039
1137
  )
@@ -1043,12 +1141,13 @@ module ZuoraAPI
1043
1141
 
1044
1142
  authentication_headers = {}
1045
1143
  if z_session
1046
- authentication_headers = {"Authorization" => self.get_session(prefix: true, auth_type: session_type) }
1144
+ authentication_headers = {"Authorization" => self.get_session(prefix: true, auth_type: session_type, zuora_track_id: zuora_track_id) }
1047
1145
  if self.entity_id.present?
1048
1146
  authentication_headers["Zuora-Entity-Ids"] = self.entity_id if headers.dig("Zuora-Entity-Ids").nil?
1049
1147
  authentication_headers.delete_if { |key, value| ["entityId", "entityName"].include?(key.to_s) }
1050
1148
  end
1051
1149
  end
1150
+ headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
1052
1151
 
1053
1152
  modified_headers = {'Content-Type' => "application/json; charset=utf-8"}.merge(authentication_headers).merge(headers)
1054
1153
 
@@ -1074,10 +1173,12 @@ module ZuoraAPI
1074
1173
  Rails.logger.debug("Response JSON: #{output_json}") if debug && output_json.present?
1075
1174
 
1076
1175
  raise_errors(type: :JSON, body: output_json, response: response)
1077
- rescue
1176
+ rescue => ex
1078
1177
  reset_files(body) if multipart
1079
1178
  raise
1080
1179
  end
1180
+
1181
+ return [output_json, response]
1081
1182
  rescue ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError => ex
1082
1183
  if self.class.to_s == 'ZuoraAPI::Oauth' && ex.message.include?("Authentication type is not supported by this Login")
1083
1184
  session_type = :bearer
@@ -1112,23 +1213,21 @@ module ZuoraAPI
1112
1213
  rescue ZuoraAPI::Exceptions::BadEntityError => ex
1113
1214
  raise ex
1114
1215
  rescue *CONNECTION_EXCEPTIONS => ex
1115
- if tries.zero?
1116
- if output_exception_messages
1117
- if Rails.logger.class.to_s == "Ougai::Logger"
1118
- Rails.logger.error("Rest Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
1119
- else
1120
- Rails.logger.error("Rest Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
1121
- end
1122
- end
1123
- raise ex
1216
+ if !tries.zero?
1217
+ tries -= 1
1218
+ self.log(location: "Rest Call", exception: ex, message: "Timed out will retry after #{timeout_sleep_interval} seconds", level: :debug)
1219
+ sleep(timeout_sleep_interval)
1220
+ retry
1124
1221
  end
1125
1222
 
1126
- tries -= 1
1127
- sleep(timeout_sleep_interval)
1128
- retry
1223
+ self.log(location: "Rest Call", exception: ex, message: "Timed out", level: :error) if output_exception_messages
1224
+ raise ex
1225
+
1129
1226
  rescue *CONNECTION_READ_EXCEPTIONS => ex
1227
+
1130
1228
  if !tries.zero?
1131
1229
  tries -= 1
1230
+ self.log(location: "Rest Call", exception: ex, message: "Timed out will retry after #{timeout_sleep_interval} seconds", level: :debug)
1132
1231
  if ex.is_a?(Errno::ECONNRESET) && ex.message.include?('SSL_connect')
1133
1232
  retry
1134
1233
  elsif timeout_retry
@@ -1136,20 +1235,15 @@ module ZuoraAPI
1136
1235
  retry
1137
1236
  end
1138
1237
  end
1139
-
1140
- if output_exception_messages
1141
- if Rails.logger.class.to_s == "Ougai::Logger"
1142
- Rails.logger.error("Rest Call - Timed out will retry after #{timeout_sleep_interval} seconds", ex)
1143
- else
1144
- Rails.logger.error("Rest Call - #{ex.class} Timed out will retry after #{timeout_sleep_interval} seconds")
1145
- end
1146
- end
1147
- raise ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from #{url}", nil, request) if ex.instance_of?(Net::ReadTimeout)
1238
+
1239
+ self.log(location: "Rest Call", exception: ex, message: "Timed out", level: :error) if output_exception_messages
1240
+ ex = ZuoraAPI::Exceptions::ZuoraAPIReadTimeout.new("Received read timeout from 'https://#{rest_domain(endpoint: url)}'", nil, request) if ex.instance_of?(Net::ReadTimeout)
1148
1241
  raise ex
1242
+
1149
1243
  rescue => ex
1150
1244
  raise ex
1151
- else
1152
- return [output_json, response]
1245
+ ensure
1246
+ self.error_logger(ex) if defined?(ex) && Rails.logger.class.to_s == "Ougai::Logger"
1153
1247
  end
1154
1248
 
1155
1249
  def update_create_tenant
@@ -1171,8 +1265,9 @@ module ZuoraAPI
1171
1265
  while !response["nextPage"].blank?
1172
1266
  url = self.rest_endpoint(response["nextPage"].split('/v1/').last)
1173
1267
  Rails.logger.debug("Fetch Catalog URL #{url}")
1174
- output_json, response = self.rest_call(:debug => false, :url => url, :errors => [ZuoraAPI::Exceptions::ZuoraAPISessionError], :timeout_retry => true )
1175
- if !output_json['success'] =~ (/(true|t|yes|y|1)$/i) || output_json['success'].class != TrueClass
1268
+ output_json, response = self.rest_call(debug: false, url: url, timeout_retry: true)
1269
+
1270
+ if !/(true|t|yes|y|1)$/.match(output_json['success'].to_s) || output_json['success'].class != TrueClass
1176
1271
  raise ZuoraAPI::Exceptions::ZuoraAPIError.new("Error Getting Catalog: #{output_json}", response)
1177
1272
  end
1178
1273
  output_json["products"].each do |product|
@@ -1198,7 +1293,7 @@ module ZuoraAPI
1198
1293
  return products, catalog_map
1199
1294
  end
1200
1295
 
1201
- def get_file(url: nil, headers: {}, z_session: true, tempfile: true, output_file_name: nil, zuora_track_id: nil, add_timestamp: true, file_path: defined?(Rails.root.join('tmp')) ? Rails.root.join('tmp') : Pathname.new(Dir.pwd), timeout_retries: 3, timeout: 120, session_type: :basic, **execute_params)
1296
+ def get_file(url: nil, headers: {}, z_session: true, tempfile: true, output_file_name: nil, zuora_track_id: nil, add_timestamp: true, file_path: defined?(Rails.root.join('tmp')) ? Rails.root.join('tmp') : Pathname.new(Dir.pwd), timeout_retries: 3, timeout: 130, session_type: :basic, **execute_params)
1202
1297
  raise "file_path must be of class Pathname" if file_path.class != Pathname
1203
1298
 
1204
1299
  retry_count ||= timeout_retries
@@ -1306,12 +1401,10 @@ module ZuoraAPI
1306
1401
  if !(retry_count -= 1).zero?
1307
1402
  self.new_session
1308
1403
  raise response.class
1309
- else
1310
- raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error)
1311
1404
  end
1312
- else
1313
- raise
1405
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new(self.current_error)
1314
1406
  end
1407
+ raise
1315
1408
  else
1316
1409
  raise ZuoraAPI::Exceptions::FileDownloadError.new("File Download Failed #{response.class}")
1317
1410
  end
@@ -1321,133 +1414,120 @@ module ZuoraAPI
1321
1414
  sleep(5)
1322
1415
  if (retry_count -= 1) >= 0
1323
1416
  retry
1324
- else
1325
- Rails.logger.error("File Download Failed")
1326
- raise
1327
1417
  end
1418
+ Rails.logger.error("File Download Failed")
1419
+ raise
1328
1420
  end
1329
1421
 
1330
1422
  def getDataSourceExport(query, extract: true, encrypted: false, zip: true, z_track_id: "")
1331
- begin
1332
- tries ||= 3
1333
- request = Nokogiri::XML::Builder.new do |xml|
1334
- xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:ns2' => "http://object.api.zuora.com/", 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:ns1' => "http://api.zuora.com/") do
1335
- xml['SOAP-ENV'].Header do
1336
- xml['ns1'].SessionHeader do
1337
- xml['ns1'].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: z_track_id)
1338
- end
1423
+ tries ||= 3
1424
+ request = Nokogiri::XML::Builder.new do |xml|
1425
+ xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:ns2' => "http://object.api.zuora.com/", 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:ns1' => "http://api.zuora.com/") do
1426
+ xml['SOAP-ENV'].Header do
1427
+ xml['ns1'].SessionHeader do
1428
+ xml['ns1'].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: z_track_id)
1339
1429
  end
1340
- xml['SOAP-ENV'].Body do
1341
- xml['ns1'].create do
1342
- xml['ns1'].zObjects('xsi:type' => "ns2:Export") do
1343
- xml['ns2'].Format 'csv'
1344
- xml['ns2'].Zip zip
1345
- xml['ns2'].Name 'googman'
1346
- xml['ns2'].Query query
1347
- xml['ns2'].Encrypted encrypted
1348
- end
1430
+ end
1431
+ xml['SOAP-ENV'].Body do
1432
+ xml['ns1'].create do
1433
+ xml['ns1'].zObjects('xsi:type' => "ns2:Export") do
1434
+ xml['ns2'].Format 'csv'
1435
+ xml['ns2'].Zip zip
1436
+ xml['ns2'].Name 'googman'
1437
+ xml['ns2'].Query query
1438
+ xml['ns2'].Encrypted encrypted
1349
1439
  end
1350
1440
  end
1351
1441
  end
1352
1442
  end
1443
+ end
1353
1444
 
1354
- response_query = HTTParty.post(self.url, body: request.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8", "Z-Track-Id" => z_track_id}, :timeout => 120)
1445
+ response_query = HTTParty.post(self.url, body: request.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8", "Z-Track-Id" => z_track_id}, :timeout => 130)
1355
1446
 
1356
- output_xml = Nokogiri::XML(response_query.body)
1357
- raise_errors(type: :SOAP, body: output_xml, response: response_query) if output_xml.xpath('//ns1:Success', 'ns1' =>'http://api.zuora.com/').text != "true"
1447
+ output_xml = Nokogiri::XML(response_query.body)
1448
+ raise_errors(type: :SOAP, body: output_xml, response: response_query) if output_xml.xpath('//ns1:Success', 'ns1' =>'http://api.zuora.com/').text != "true"
1358
1449
 
1359
- # raise "Export Creation Unsuccessful : #{response_query.code}: #{response_query.parsed_response}" if output_xml.xpath('//ns1:Success', 'ns1' =>'http://api.zuora.com/').text != "true"
1360
-
1361
- id = output_xml.xpath('//ns1:Id', 'ns1' =>'http://api.zuora.com/').text
1450
+ # raise "Export Creation Unsuccessful : #{response_query.code}: #{response_query.parsed_response}" if output_xml.xpath('//ns1:Success', 'ns1' =>'http://api.zuora.com/').text != "true"
1451
+
1452
+ id = output_xml.xpath('//ns1:Id', 'ns1' =>'http://api.zuora.com/').text
1362
1453
 
1363
- confirmRequest = Nokogiri::XML::Builder.new do |xml|
1364
- xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:ns2' => "http://object.api.zuora.com/", 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:ns1' => "http://api.zuora.com/") do
1365
- xml['SOAP-ENV'].Header do
1366
- xml['ns1'].SessionHeader do
1367
- xml['ns1'].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: z_track_id)
1368
- end
1454
+ confirmRequest = Nokogiri::XML::Builder.new do |xml|
1455
+ xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' => "http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:ns2' => "http://object.api.zuora.com/", 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance", 'xmlns:ns1' => "http://api.zuora.com/") do
1456
+ xml['SOAP-ENV'].Header do
1457
+ xml['ns1'].SessionHeader do
1458
+ xml['ns1'].session self.get_session(prefix: false, auth_type: :basic, zuora_track_id: z_track_id)
1369
1459
  end
1370
- xml['SOAP-ENV'].Body do
1371
- xml['ns1'].query do
1372
- xml['ns1'].queryString "SELECT Id, CreatedById, CreatedDate, Encrypted, FileId, Format, Name, Query, Size, Status, StatusReason, UpdatedById, UpdatedDate, Zip From Export where Id = '#{id}'"
1373
- end
1460
+ end
1461
+ xml['SOAP-ENV'].Body do
1462
+ xml['ns1'].query do
1463
+ xml['ns1'].queryString "SELECT Id, CreatedById, CreatedDate, Encrypted, FileId, Format, Name, Query, Size, Status, StatusReason, UpdatedById, UpdatedDate, Zip From Export where Id = '#{id}'"
1374
1464
  end
1375
1465
  end
1376
1466
  end
1377
- result = 'Waiting'
1378
-
1379
- while result != "Completed"
1380
- sleep 3
1381
- response_query = HTTParty.post(self.url, body: confirmRequest.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8", "Z-Track-Id" => z_track_id}, :timeout => 120)
1382
-
1383
- output_xml = Nokogiri::XML(response_query.body)
1384
- result = output_xml.xpath('//ns2:Status', 'ns2' =>'http://object.api.zuora.com/').text
1385
- status_code = response_query.code if response_query
1467
+ end
1468
+ result = 'Waiting'
1386
1469
 
1387
- raise_errors(type: :SOAP, body: output_xml, response: response_query) if result.blank? || result == "Failed"
1388
- # raise "Export Creation Unsuccessful : #{response_query.code}: #{response_query.parsed_response}" if result.blank? || result == "Failed"
1389
- end
1470
+ while result != "Completed"
1471
+ sleep 3
1472
+ response_query = HTTParty.post(self.url, body: confirmRequest.to_xml(:save_with => XML_SAVE_OPTIONS).strip, headers: {'Content-Type' => "application/json; charset=utf-8", "Z-Track-Id" => z_track_id}, :timeout => 130)
1390
1473
 
1391
- file_id = output_xml.xpath('//ns2:FileId', 'ns2' =>'http://object.api.zuora.com/').text
1392
- export_file = get_file(:url => self.fileURL(file_id))
1393
- export_file_path = export_file.path
1394
- Rails.logger.debug("=====> Export path #{export_file.path}")
1395
-
1396
- if extract && zip
1397
- require "zip"
1398
- new_path = export_file_path.partition('.zip').first
1399
- zipped = Zip::File.open(export_file_path)
1400
- file_handle = zipped.entries.first
1401
- file_handle.extract(new_path)
1402
- File.delete(export_file_path)
1403
- return new_path
1404
- else
1405
- return export_file_path
1406
- end
1407
- rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
1408
- if !(tries -= 1).zero?
1409
- Rails.logger.info("Export call failed - Trace ID: #{z_track_id}")
1410
- self.new_session
1411
- retry
1412
- else
1413
- raise ex
1414
- end
1474
+ output_xml = Nokogiri::XML(response_query.body)
1475
+ result = output_xml.xpath('//ns2:Status', 'ns2' =>'http://object.api.zuora.com/').text
1476
+ status_code = response_query.code if response_query
1415
1477
 
1416
- rescue ZuoraAPI::Exceptions::ZuoraUnexpectedError => ex
1417
- if !(tries -= 1).zero?
1418
- Rails.logger.info("Trace ID: #{z_track_id} UnexpectedError, will retry after 10 seconds")
1419
- sleep 10
1420
- retry
1421
- else
1422
- raise ex
1423
- end
1478
+ raise_errors(type: :SOAP, body: output_xml, response: response_query) if result.blank? || result == "Failed"
1479
+ # raise "Export Creation Unsuccessful : #{response_query.code}: #{response_query.parsed_response}" if result.blank? || result == "Failed"
1480
+ end
1424
1481
 
1425
- rescue *ZUORA_API_ERRORS => ex
1426
- raise ex
1482
+ file_id = output_xml.xpath('//ns2:FileId', 'ns2' =>'http://object.api.zuora.com/').text
1483
+ export_file = get_file(:url => self.fileURL(file_id))
1484
+ export_file_path = export_file.path
1485
+ Rails.logger.debug("=====> Export path #{export_file.path}")
1486
+
1487
+ if extract && zip
1488
+ require "zip"
1489
+ new_path = export_file_path.partition('.zip').first
1490
+ zipped = Zip::File.open(export_file_path)
1491
+ file_handle = zipped.entries.first
1492
+ file_handle.extract(new_path)
1493
+ File.delete(export_file_path)
1494
+ return new_path
1495
+ else
1496
+ return export_file_path
1497
+ end
1498
+ rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
1499
+ if !(tries -= 1).zero?
1500
+ Rails.logger.info("Export call failed - Trace ID: #{z_track_id}")
1501
+ self.new_session
1502
+ retry
1503
+ end
1504
+ raise ex
1427
1505
 
1428
- rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
1429
- if !(tries -= 1).zero?
1430
- Rails.logger.info("Trace ID: #{z_track_id} Timed out will retry after 5 seconds")
1431
- sleep 5
1432
- retry
1433
- else
1434
- raise ex
1435
- end
1506
+ rescue ZuoraAPI::Exceptions::ZuoraUnexpectedError => ex
1507
+ if !(tries -= 1).zero?
1508
+ Rails.logger.info("Trace ID: #{z_track_id} UnexpectedError, will retry after 10 seconds")
1509
+ sleep 10
1510
+ retry
1511
+ end
1512
+ raise ex
1436
1513
 
1437
- rescue Errno::ECONNRESET => ex
1438
- if !(tries -= 1).zero? && ex.message.include?('SSL_connect')
1439
- retry
1440
- else
1441
- raise ex
1442
- end
1514
+ rescue *ZUORA_API_ERRORS => ex
1515
+ raise ex
1443
1516
 
1444
- rescue ZuoraAPI::Exceptions::BadEntityError => ex
1445
- raise ex
1517
+ rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
1518
+ if !(tries -= 1).zero?
1519
+ Rails.logger.info("Trace ID: #{z_track_id} Timed out will retry after 5 seconds")
1520
+ sleep 5
1521
+ retry
1446
1522
  end
1523
+ raise ex
1524
+
1525
+ rescue ZuoraAPI::Exceptions::BadEntityError => ex
1526
+ raise ex
1447
1527
  end
1448
1528
 
1449
1529
  def query(query, parse = false)
1450
- output_xml, input_xml = self.soap_call({:debug => false, :timeout_retry => true}) do |xml|
1530
+ output_xml, input_xml = self.soap_call(debug: false, timeout_retry: true) do |xml|
1451
1531
  xml['ns1'].query do
1452
1532
  xml['ns1'].queryString query
1453
1533
  end
@@ -10,113 +10,22 @@ module ZuoraAPI
10
10
  end
11
11
 
12
12
  def new_session(auth_type: :basic, debug: false, zuora_track_id: nil)
13
- raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Basic Login, does not support Authentication of Type: #{auth_type}") if auth_type != :basic
14
- raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Request Basic Login but either 'Username' or 'Password' were not passed.") if (self.password.blank? && self.username.blank?)
13
+ super do
14
+ raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Basic Login, does not support Authentication of Type: #{auth_type}") if auth_type != :basic
15
+ raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Request Basic Login but either 'Username' or 'Password' were not passed.") if (self.password.blank? && self.username.blank?)
15
16
 
16
- tries ||= 2
17
- request = Nokogiri::XML::Builder.new do |xml|
18
- xml['SOAP-ENV'].Envelope('xmlns:SOAP-ENV' =>"http://schemas.xmlsoap.org/soap/envelope/", 'xmlns:api' => "http://api.zuora.com/" ) do
19
- xml['SOAP-ENV'].Header
20
- xml['SOAP-ENV'].Body do
21
- xml['api'].login do
22
- xml['api'].username self.username
23
- xml['api'].password self.password
24
- xml['api'].entityId self.entity_id if !self.entity_id.blank?
25
- end
17
+ output_xml, input_xml, response = soap_call(timeout_retry: true, skip_session: true, zuora_track_id: zuora_track_id) do |xml|
18
+ xml['api'].login do
19
+ xml['api'].username self.username
20
+ xml['api'].password self.password
21
+ xml['api'].entityId self.entity_id if !self.entity_id.blank?
26
22
  end
27
23
  end
28
- end
29
-
30
- input_xml = Nokogiri::XML(request.to_xml(:save_with => XML_SAVE_OPTIONS).strip)
31
- input_xml.xpath('//ns1:session', 'ns1' =>'http://api.zuora.com/').children.remove
32
- Rails.logger.debug('Connect') {"SOAP XML: #{input_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}"} if debug
33
-
34
- headers = { 'Content-Type' => "text/xml; charset=utf-8" }
35
- headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
36
24
 
37
- response_query = HTTParty.post(self.url,:body => request.to_xml(:save_with => XML_SAVE_OPTIONS).strip, :headers => headers, :timeout => 10)
38
- output_xml = Nokogiri::XML(response_query.body)
39
- Rails.logger.debug('Connect') {"Response Code: #{response_query.code} SOAP XML: #{output_xml.to_xml(:save_with => XML_SAVE_OPTIONS).strip}"} if debug
40
-
41
- if !response_query.success?
42
- self.current_session = nil
43
- if output_xml.namespaces.size > 0 && output_xml.xpath('//soapenv:Fault').size > 0
44
- self.current_error = output_xml.xpath('//fns:FaultMessage', 'fns' =>'http://fault.api.zuora.com/').text
45
- if self.current_error.include?('deactivated')
46
- self.status = 'Deactivated'
47
- self.current_error = 'Deactivated user login, please check with Zuora tenant administrator'
48
- self.errors[:username] = self.current_error
49
- elsif self.current_error.include?('inactive')
50
- self.status = 'Inactive'
51
- self.current_error = 'Inactive user login, please check with Zuora tenant administrator'
52
- self.errors[:username] = self.current_error
53
- elsif self.current_error.include?("invalid username or password") || self.current_error.include?("Invalid login. User name and password do not match.")
54
- self.status = 'Invalid Login'
55
- self.current_error = 'Invalid login, please check username and password or URL endpoint'
56
- self.errors[:username] = self.current_error
57
- self.errors[:password] = self.current_error
58
- elsif self.current_error.include?('unsupported version')
59
- self.status = 'Unsupported API Version'
60
- self.current_error = 'Unsupported API version, please verify URL endpoint'
61
- self.errors[:url] = self.current_error
62
- elsif self.current_error.include?('invalid api version')
63
- self.status = 'Invalid API Version'
64
- self.current_error = 'Invalid API version, please verify URL endpoint'
65
- self.errors[:url] = self.current_error
66
- elsif self.current_error.include?('invalid session')
67
- self.status = 'Invalid Session'
68
- self.current_error = 'Session invalid, please update session and verify URL endpoint'
69
- self.errors[:session] = self.current_error
70
- elsif self.current_error.include?('Your IP address')
71
- self.status = 'Restricted IP'
72
- self.current_error = 'IP restricted, contact Zuora tenant administrator and remove IP restriction'
73
- self.errors[:base] = self.current_error
74
- elsif self.current_error.include?('This account has been locked')
75
- self.status = 'Locked'
76
- self.current_error = 'Locked user login, please wait or navigate to Zuora to unlock user'
77
- self.errors[:username] = self.current_error
78
- elsif self.current_error.include?('Entity not exist:')
79
- self.status = 'Entity Missing'
80
- self.errors[:base] = self.current_error
81
- else
82
- self.status = 'Unknown'
83
- self.current_error = output_xml.xpath('//faultstring').text if self.current_error.blank?
84
- self.errors[:base] = self.current_error
85
- end
86
-
87
- else
88
- self.status = 'Unknown'
89
- self.current_error = output_xml.xpath('//faultstring').text if self.current_error.blank?
90
- self.errors[:base] = self.current_error
91
- end
92
- else
93
- #Username & password combo
94
25
  retrieved_session = output_xml.xpath('//ns1:Session', 'ns1' =>'http://api.zuora.com/').text
95
- raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("No session found for api call.", response_query) if retrieved_session.blank?
96
- self.status = 'Active'
26
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("No session found for api call.", response) if retrieved_session.blank?
97
27
  self.current_session = retrieved_session
98
- end
99
- return self.status
100
- rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
101
- if !tries.zero?
102
- tries -= 1
103
- sleep(self.timeout_sleep)
104
- retry
105
- else
106
- if Rails.logger.class.to_s == "Ougai::Logger"
107
- Rails.logger.error("BasicLogin - Timed out", ex)
108
- else
109
- Rails.logger.error("BasicLogin - #{ex.class} Timed out")
110
- end
111
-
112
- self.current_error = "Request timed out. Try again"
113
- self.status = 'Timeout'
114
- return self.status
115
- end
116
- rescue EOFError
117
- if self.url.match?(/.*services\d{1,}.zuora.com*/)
118
- self.current_error = "Services tenant '#{self.url.scan(/.*\/\/(services\d{1,}).zuora.com*/).last.first}' is no longer available."
119
- self.status = 'Not Available'
28
+ self.status = 'Active'
120
29
  return self.status
121
30
  end
122
31
  end
@@ -12,16 +12,18 @@ module ZuoraAPI
12
12
  end
13
13
 
14
14
  def new_session(auth_type: nil, zuora_track_id: nil)
15
- if auth_type == :bearer
16
- get_bearer_token(zuora_track_id: zuora_track_id)
17
- elsif auth_type == :basic
18
- get_bearer_token(zuora_track_id: zuora_track_id) if self.oauth_expired?
19
- get_z_session(zuora_track_id: zuora_track_id) if self.status == 'Active'
20
- else
21
- get_bearer_token(zuora_track_id: zuora_track_id)
22
- get_z_session(zuora_track_id: zuora_track_id) if self.status == 'Active'
15
+ super do
16
+ if auth_type == :bearer
17
+ get_bearer_token(zuora_track_id: zuora_track_id)
18
+ elsif auth_type == :basic
19
+ get_bearer_token(zuora_track_id: zuora_track_id) if self.oauth_expired?
20
+ get_z_session(zuora_track_id: zuora_track_id)
21
+ else
22
+ get_bearer_token(zuora_track_id: zuora_track_id) if self.oauth_expired?
23
+ get_z_session(zuora_track_id: zuora_track_id)
24
+ end
25
+ return self.status
23
26
  end
24
- return self.status
25
27
  end
26
28
 
27
29
  def get_active_bearer_token
@@ -30,7 +32,6 @@ module ZuoraAPI
30
32
  end
31
33
 
32
34
  def get_z_session(debug: false, zuora_track_id: nil)
33
- tries ||= 2
34
35
  headers = self.entity_id.present? ? {"Zuora-Entity-Ids" => self.entity_id } : {}
35
36
  headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
36
37
  output_json, response = self.rest_call(:url => self.rest_endpoint("connections"), :session_type => :bearer, :headers => headers)
@@ -44,49 +45,22 @@ module ZuoraAPI
44
45
  headers: response.headers.to_s,
45
46
  }
46
47
  })
47
- raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Failure Parsing Cookie Headers")
48
+ raise ZuoraAPI::Exceptions::ZuoraAPISessionError.new("Failure Parsing Cookie Headers", response)
48
49
  end
49
- rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
50
- if !tries.zero?
51
- tries -= 1
52
- Rails.logger.debug {"Session Invalid"}
53
- self.new_session(auth_type: :bearer)
54
- retry
55
- end
56
- raise ex
57
-
58
- rescue ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition => ex
59
- raise ex
60
-
61
- rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
62
- if !tries.zero?
63
- tries -= 1
64
- sleep(self.timeout_sleep)
65
- retry
66
- end
67
- if Rails.logger.class.to_s == "Ougai::Logger"
68
- Rails.logger.error("OAuthLogin - Timed out", ex)
69
- else
70
- Rails.logger.error("OAuthLogin - #{ex.class} Timed out")
71
- end
72
- self.current_error = "Request timed out. Try again"
73
- self.status = 'Timeout'
74
- return self.status
75
50
  end
76
51
 
77
52
  def get_bearer_token(zuora_track_id: nil)
78
- tries ||= 2
79
53
  raise ZuoraAPI::Exceptions::ZuoraAPIAuthenticationTypeError.new("Request Oauth Login but either 'Oauth Client Id' or 'Oauth Secret' were not passed") if self.oauth_client_id.blank? || self.oauth_secret.blank?
80
54
 
81
55
  headers = { "content-type" => "application/x-www-form-urlencoded" }
82
56
  headers['Zuora-Track-Id'] = zuora_track_id if zuora_track_id.present?
83
57
 
84
58
  output_json, response = self.rest_call(:method => :post,
85
- :url => self.rest_endpoint.chomp('v1/').concat("oauth/token"),
86
- :z_session => false,
87
- :session_type => :bearer,
88
- :headers => headers,
89
- :body => {"client_id"=> self.oauth_client_id, "client_secret"=>self.oauth_secret, "grant_type" =>"client_credentials"}
59
+ url: self.rest_endpoint.chomp('v1/').concat("oauth/token"),
60
+ z_session: false,
61
+ timeout_retry: true,
62
+ headers: headers,
63
+ body: {"client_id"=> self.oauth_client_id, "client_secret"=>self.oauth_secret, "grant_type" =>"client_credentials"}
90
64
  )
91
65
 
92
66
  self.bearer_token = output_json["access_token"]
@@ -96,44 +70,6 @@ module ZuoraAPI
96
70
  self.status = 'Active'
97
71
 
98
72
  return self.status
99
-
100
- rescue ZuoraAPI::Exceptions::ZuoraAPIInternalServerError => ex
101
- raise ex if tries.zero?
102
-
103
- tries -= 1
104
- sleep(self.timeout_sleep)
105
- retry
106
- rescue ZuoraAPI::Exceptions::ZuoraAPISessionError => ex
107
- self.bearer_token = nil
108
- self.oauth_session_expires_at = nil
109
- self.current_error = ex.message
110
- case ex.message
111
- when "Forbidden"
112
- self.current_error = "The user associated to OAuth credential set has been deactivated."
113
- self.status = 'Deactivated'
114
- else
115
- self.current_error = "Invalid login, please check client ID and Client Secret or URL endpoint"
116
- self.status = 'Invalid Login'
117
- end
118
-
119
- return self.status
120
- rescue ZuoraAPI::Exceptions::ZuoraAPIError, ZuoraAPI::Exceptions::ZuoraAPIRequestLimit, ZuoraAPI::Exceptions::ZuoraAPILockCompetition => ex
121
- raise ex
122
- rescue *(CONNECTION_EXCEPTIONS + CONNECTION_READ_EXCEPTIONS) => ex
123
- if !tries.zero?
124
- tries -= 1
125
- sleep(self.timeout_sleep)
126
- retry
127
- else
128
- if Rails.logger.class.to_s == "Ougai::Logger"
129
- Rails.logger.error("OAuthLogin - Timed out will retry after #{self.timeout_sleep} seconds", ex)
130
- else
131
- Rails.logger.error("OAuthLogin - #{ex.class} Timed out will retry after #{self.timeout_sleep} seconds")
132
- end
133
- self.current_error = "Invalid login, please check client ID and Client Secret or URL endpoint"
134
- self.status = 'Timeout'
135
- return self.status
136
- end
137
73
  end
138
74
 
139
75
  def oauth_expired?
@@ -1,3 +1,3 @@
1
1
  module ZuoraAPI
2
- VERSION = "1.7.66c"
2
+ VERSION = "1.7.66i"
3
3
  end
@@ -18,11 +18,12 @@ Gem::Specification.new do |spec|
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.12"
21
+ spec.add_development_dependency "bundler"
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
23
  spec.add_development_dependency "rspec", "~> 3.0"
24
24
  spec.add_development_dependency("webmock")
25
- spec.add_development_dependency("simplecov")
25
+ spec.add_development_dependency("simplecov", "~> 0.18.5")
26
+ spec.add_dependency("ougai")
26
27
  spec.add_dependency("nokogiri")
27
28
  spec.add_dependency("httparty")
28
29
  spec.add_dependency("rubyzip")
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zuora_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.66c
4
+ version: 1.7.66i
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: 2020-06-03 00:00:00.000000000 Z
11
+ date: 2020-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.12'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.12'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -68,12 +68,26 @@ dependencies:
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.18.5
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.18.5
83
+ - !ruby/object:Gem::Dependency
84
+ name: ougai
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - ">="
74
88
  - !ruby/object:Gem::Version
75
89
  version: '0'
76
- type: :development
90
+ type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
@@ -186,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
200
  - !ruby/object:Gem::Version
187
201
  version: 1.3.1
188
202
  requirements: []
189
- rubygems_version: 3.0.3
203
+ rubygems_version: 3.1.2
190
204
  signing_key:
191
205
  specification_version: 4
192
206
  summary: Gem that provides easy integration to Zuora