spree_vpago 2.3.2 → 2.3.4

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: 40b1b2417da2209fc3545dc75fb99354e9fd009adc565d3c4d920b59f18c4655
4
- data.tar.gz: dbb1754379d9378dcbfb9fb1d225b7c73628475ae1155e1ad5b198df1e323535
3
+ metadata.gz: 4e73bfb9e0eac7606f41017d8ca6c90e9853296a588f4fccd305331ec4c0c6bc
4
+ data.tar.gz: d8180f240e40c47b8983c460892079d2d954638a486855deda122e7971c90bed
5
5
  SHA512:
6
- metadata.gz: 007761d54598f02ee411f16962eec6ad167eb5eb4623f11f27c8e278e05b2fbc023f71ef4ed3e8eb723870692d83d25155f3fffd85d9fd7880057a9fa1ba2791
7
- data.tar.gz: a5ddf6866c3905d6b12224388e9a1b91ad3b19dbdd7fa6dfd936b23227081d8910820795678fac206a7384066e479ae851a23f75dd035abd62abcf47d9e25446
6
+ metadata.gz: 34e2bd88bce6cb6a090d57fe8e6ea7c9ade90f813d834c998a66a697a96b881700ac084b78dd1074a9ec62d63a87d77942f421a25d9f6c046272526a6a407231
7
+ data.tar.gz: 231f3bdd5f51c7dd42b78dd1e93b45937031e32abf49383388f4c62c57de4668d2b64dd9bb89fa6f81d325a25db760c7daaa296b2dc5d69c64ee94b9b3badebf
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- spree_vpago (2.3.2)
4
+ spree_vpago (2.3.4)
5
5
  faraday
6
6
  google-cloud-firestore
7
7
  spree_api (>= 4.5)
@@ -17,7 +17,7 @@ module Spree
17
17
 
18
18
  @order = @payment.order
19
19
 
20
- Rails.logger.info("[Vpago][#{@payment.number}] Showing checkout page for order #{@order.number}")
20
+ VpagoLogger.log(label: 'Spree::VpagoPaymentsController#checkout', data: vpago_log_context)
21
21
  end
22
22
 
23
23
  # GET
@@ -27,7 +27,7 @@ module Spree
27
27
 
28
28
  @order = @payment.order
29
29
 
30
- Rails.logger.info("[Vpago][#{@payment.number}] Showing processing page for order #{@order.number}")
30
+ VpagoLogger.log(label: 'Spree::VpagoPaymentsController#processing', data: vpago_log_context)
31
31
  end
32
32
 
33
33
  # GET
@@ -38,7 +38,7 @@ module Spree
38
38
  @order = @payment.order
39
39
  raise CanCan::AccessDenied unless @order.completed?
40
40
 
41
- Rails.logger.info("[Vpago][#{@payment.number}] Showing success page for order #{@order.number}")
41
+ VpagoLogger.log(label: 'Spree::VpagoPaymentsController#success', data: vpago_log_context)
42
42
  end
43
43
 
44
44
  # GET
@@ -49,20 +49,21 @@ module Spree
49
49
  return render json: { status: :success }, status: :ok if @payment.completed?
50
50
  return render json: { status: :failed }, status: :ok if @payment.failed?
51
51
 
52
- if @payment.payment_method.support_check_transaction_api?
53
- Rails.logger.info("[Vpago][#{@payment.number}] Checking transaction for payment #{@payment.number}")
54
- checker = @payment.payment_method.check_transaction(@payment)
55
- Rails.logger.info("[Vpago][#{@payment.number}] Check transaction result for payment #{@payment.number} with success: #{checker.success?}, failed: #{checker.try(:failed?)}")
56
-
57
- if checker.success?
58
- render json: { status: :success }, status: :ok
59
- elsif checker.try(:failed?) == true
60
- render json: { status: :failed }, status: :ok
61
- else
62
- render json: { status: :pending }, status: :ok
63
- end
52
+ unless @payment.payment_method.support_check_transaction_api?
53
+ VpagoLogger.log(label: 'Spree::VpagoPaymentsController#check_transaction unsupported', data: vpago_log_context)
54
+ return render json: { status: :pending }, status: :ok
55
+ end
56
+
57
+ checker = VpagoLogger.log(
58
+ label: 'Spree::VpagoPaymentsController#check_transaction',
59
+ data: vpago_log_context
60
+ ) { @payment.payment_method.check_transaction(@payment) }
61
+
62
+ if checker.success?
63
+ render json: { status: :success }, status: :ok
64
+ elsif checker.try(:failed?) == true
65
+ render json: { status: :failed }, status: :ok
64
66
  else
65
- Rails.logger.info("[Vpago][#{@payment.number}] Payment method does not support check transaction API")
66
67
  render json: { status: :pending }, status: :ok
67
68
  end
68
69
  end
@@ -75,30 +76,35 @@ module Spree
75
76
  @payment = Vpago::PaymentFinder.new(return_params).find_and_verify
76
77
 
77
78
  if @payment.nil?
78
- Rails.logger.error("[Vpago] Payment not found for params: #{return_params}")
79
+ VpagoLogger.error(
80
+ label: 'Spree::VpagoPaymentsController#process_payment payment_not_found',
81
+ data: vpago_log_context(params: return_params)
82
+ )
79
83
  return render_not_found
80
84
  end
81
85
 
82
- Rails.logger.info("[Vpago][#{@payment.number}] Payment found: #{@payment&.number}, order: #{@payment&.order&.number}")
86
+ VpagoLogger.log(label: 'Spree::VpagoPaymentsController#process_payment payment_found', data: vpago_log_context)
83
87
 
84
88
  # for ABA reviewing mode, we can disable pushback from bank, and only process it from our app UI instead.
85
89
  # This will give ABA team to know that we don't rely on just pushback and have fallback to process payment.
86
90
  if @payment.payment_method.type_payway_v2? && @payment.payment_method.reviewing_mode? && request_from_external_server?
87
- Rails.logger.info("[Vpago][#{@payment.number}] Received payment notification from bank in reviewing mode, skipping processing")
91
+ VpagoLogger.log(label: 'Spree::VpagoPaymentsController#process_payment skipped_reviewing_mode', data: vpago_log_context)
88
92
  return render json: { status: :ok }, status: :ok
89
93
  end
90
94
 
91
95
  unless @payment.order.paid?
92
- Rails.logger.info("[Vpago][#{@payment.number}] Enqueuing payment processor job for payment #{@payment.number}")
93
- Vpago::PaymentProcessorJob.perform_later(
94
- payment_number: @payment.number
95
- )
96
+ VpagoLogger.log(
97
+ label: 'Spree::VpagoPaymentsController#process_payment enqueue_payment_processor_job',
98
+ data: vpago_log_context
99
+ ) { Vpago::PaymentProcessorJob.perform_later(payment_number: @payment.number) }
96
100
  end
97
101
 
98
- Rails.logger.info("[Vpago][#{@payment.number}] Successfully enqueued payment processor job for payment #{@payment.number}")
99
102
  render json: { status: :ok }, status: :ok
100
103
  rescue StandardError => e
101
- Rails.logger.error("[Vpago][#{@payment&.number}] Failed to enqueue payment processor job: #{e.message}")
104
+ VpagoLogger.error(
105
+ label: 'Spree::VpagoPaymentsController#process_payment failed',
106
+ data: vpago_log_context(error_class: e.class.name, error_message: e.message, backtrace: e.backtrace&.first(5))
107
+ )
102
108
  render json: { status: :internal_server_error, message: 'Failed to enqueue payment processor job' }, status: :internal_server_error
103
109
  end
104
110
 
@@ -107,14 +113,28 @@ module Spree
107
113
  return render json: { status: { code: '000001', message: 'success' }, data: nil }, status: :ok if request.method != 'POST'
108
114
 
109
115
  @payment = Spree::Payment.find_by(number: params.dig(:data, :external_ref_id))
110
- return render_not_found unless @payment
111
116
 
112
- Vpago::PaymentProcessorJob.perform_later(payment_number: @payment.number) unless @payment.order.paid?
113
- Rails.logger.info("[Vpago][#{@payment.number}] Successfully enqueued payment processor job for payment #{@payment.number}")
117
+ if @payment.nil?
118
+ VpagoLogger.error(
119
+ label: 'Spree::VpagoPaymentsController#true_money_process_payment payment_not_found',
120
+ data: vpago_log_context(external_ref_id: params.dig(:data, :external_ref_id))
121
+ )
122
+ return render_not_found
123
+ end
124
+
125
+ unless @payment.order.paid?
126
+ VpagoLogger.log(
127
+ label: 'Spree::VpagoPaymentsController#true_money_process_payment enqueue_payment_processor_job',
128
+ data: vpago_log_context
129
+ ) { Vpago::PaymentProcessorJob.perform_later(payment_number: @payment.number) }
130
+ end
114
131
 
115
132
  render json: { status: { code: '000001', message: 'success' }, data: nil }, status: :ok
116
133
  rescue StandardError => e
117
- Rails.logger.error("[Vpago][#{@payment&.number}] Failed to enqueue payment processor job: #{e.message}")
134
+ VpagoLogger.error(
135
+ label: 'Spree::VpagoPaymentsController#true_money_process_payment failed',
136
+ data: vpago_log_context(error_class: e.class.name, error_message: e.message, backtrace: e.backtrace&.first(5))
137
+ )
118
138
  render json: { status: :internal_server_error, message: 'Failed to enqueue payment processor job' }, status: :internal_server_error
119
139
  end
120
140
 
@@ -144,5 +164,17 @@ module Spree
144
164
  def request_from_external_server?
145
165
  params[:internal_client].blank? || params[:internal_client] == 'false'
146
166
  end
167
+
168
+ def vpago_log_context(extra = {})
169
+ {
170
+ timestamp: Time.current.utc.iso8601(3),
171
+ remote_ip: request.remote_ip,
172
+ payment_number: @payment&.number,
173
+ order_number: @payment&.order&.number,
174
+ payment_method_type: @payment&.payment_method&.type,
175
+ payment_method_name: @payment&.payment_method&.name,
176
+ request_id: request.request_id
177
+ }.merge(extra)
178
+ end
147
179
  end
148
180
  end
@@ -5,7 +5,22 @@ module Vpago
5
5
 
6
6
  def perform(options)
7
7
  payment = Spree::Payment.find_by!(number: options[:payment_number])
8
- Vpago::PaymentProcessor.new(payment: payment).call
8
+
9
+ VpagoLogger.log(
10
+ label: 'Vpago::PaymentProcessorJob#perform',
11
+ data: {
12
+ payment_number: payment.number,
13
+ order_number: payment.order.number,
14
+ payment_method_type: payment.payment_method.type,
15
+ payment_method_name: payment.payment_method.name
16
+ }
17
+ ) { Vpago::PaymentProcessor.new(payment: payment).call }
18
+ rescue StandardError => e
19
+ VpagoLogger.error(
20
+ label: 'Vpago::PaymentProcessorJob#perform failed',
21
+ data: { payment_number: options[:payment_number], error_class: e.class.name, error_message: e.message, backtrace: e.backtrace&.first(5) }
22
+ )
23
+ raise
9
24
  end
10
25
  end
11
26
  end
@@ -24,17 +24,18 @@ module Vpago
24
24
  :unable_to_complete_order
25
25
  end
26
26
 
27
- # example.
28
- # Started Vpago::PaymentProcessor#process_payment! for payment_number: PX81YZX with args: {}
29
- # Completed Vpago::PaymentProcessor#process_payment! for payment_number: PX81YZX in 2000ms
30
- def log_process(method, *args)
31
- start_time = Time.now
32
- Rails.logger.error("Started #{self.class}##{method} for payment_number: #{@payment.number} with args: #{args}")
33
-
34
- yield
35
-
36
- duration_ms = (Time.now - start_time) * 1000
37
- Rails.logger.error("Completed #{self.class}##{method} for payment_number: #{@payment.number} in #{duration_ms}ms")
27
+ def log_process(method, *args, &)
28
+ VpagoLogger.log(
29
+ label: "#{self.class.name}##{method}",
30
+ data: {
31
+ payment_number: @payment.number,
32
+ order_number: @payment.order.number,
33
+ payment_method_type: @payment.payment_method.type,
34
+ payment_method_name: @payment.payment_method.name,
35
+ args: args
36
+ },
37
+ &
38
+ )
38
39
  end
39
40
 
40
41
  def user_informer
@@ -1,7 +1,7 @@
1
1
  module SpreeVpago
2
2
  module_function
3
3
 
4
- VERSION = '2.3.2'.freeze
4
+ VERSION = '2.3.4'.freeze
5
5
 
6
6
  def version
7
7
  Gem::Version.new VERSION
@@ -0,0 +1,59 @@
1
+ # lib/vpago_logger.rb
2
+ module VpagoLogger
3
+ def self.log(label:, data: nil)
4
+ message = { label: label, data: safe_serialize(data) }
5
+ start_time = Time.current
6
+ Rails.logger.info(message.to_json)
7
+
8
+ return unless block_given?
9
+
10
+ # Capture the block's return value and return it to preserve existing behavior for callers expecting that value.
11
+ block_result = yield
12
+
13
+ message[:start_time] = start_time.iso8601(3)
14
+ message[:duration_ms] = (Time.current - start_time) * 1000
15
+ message[:result] = safe_serialize(block_result)
16
+ Rails.logger.info(message.to_json)
17
+ block_result
18
+ end
19
+
20
+ def self.error(label:, data: nil)
21
+ message = {
22
+ label: label,
23
+ data: safe_serialize(data)
24
+ }
25
+
26
+ Rails.logger.error(message.to_json)
27
+ end
28
+
29
+ # Safely serializes objects for JSON logging.
30
+ #
31
+ # @param obj [Object] The object to serialize
32
+ # @param depth [Integer] Internal parameter tracking recursion depth (max: 50)
33
+ # @return [Object] A JSON-safe representation of the input object
34
+ def self.safe_serialize(obj, depth: 0)
35
+ return '[Max Depth Exceeded]' if depth > 50
36
+
37
+ if obj.is_a?(Hash)
38
+ obj.each_with_object({}) do |(k, v), memo|
39
+ memo[safe_serialize(k, depth: depth + 1)] = safe_serialize(v, depth: depth + 1)
40
+ end
41
+ elsif obj.is_a?(Array)
42
+ obj.map { |item| safe_serialize(item, depth: depth + 1) }
43
+ elsif obj.is_a?(Date)
44
+ obj.iso8601
45
+ elsif obj.is_a?(Time) || obj.is_a?(DateTime) || obj.is_a?(ActiveSupport::TimeWithZone)
46
+ obj.iso8601(3)
47
+ elsif obj.is_a?(ActiveJob::Base)
48
+ {
49
+ job_class: obj.class.name,
50
+ job_id: obj.job_id,
51
+ arguments: safe_serialize(obj.arguments, depth: depth + 1)
52
+ }
53
+ elsif obj.respond_to?(:id)
54
+ { class: obj.class.name, id: obj.id }
55
+ else
56
+ obj.to_s
57
+ end
58
+ end
59
+ end
@@ -1,5 +1,5 @@
1
1
  {
2
- "systemParams": "linux-x64-115",
2
+ "systemParams": "linux-x64-127",
3
3
  "modulesFolders": [
4
4
  "node_modules"
5
5
  ],
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_vpago
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.2
4
+ version: 2.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-05-07 00:00:00.000000000 Z
11
+ date: 2026-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -421,6 +421,7 @@ files:
421
421
  - lib/vpago/wing_sdk/payment_retriever.rb
422
422
  - lib/vpago/wing_sdk/transaction_status_checker.rb
423
423
  - lib/vpago/wing_sdk/transaction_status_response.rb
424
+ - lib/vpago_logger.rb
424
425
  - node_modules/.yarn-integrity
425
426
  - package-lock.json
426
427
  - package.json