spree_vpago 2.1.9 → 2.2.0.pre.addpaymentlogger

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: 7aa144ac2f71930d7c834534d8b10723530af727d3fcf64df7c7a826f3c3788b
4
- data.tar.gz: 9269d7fd90b13f9a1eb4f145a3f5d09c5f5f84e4164a2e5e4e6ba1e9ba5ad1ee
3
+ metadata.gz: 5a95a94461d263e091ae13318a66e83076486a6e6a0e51e0de47f491afa0ce47
4
+ data.tar.gz: 36a1f1b281927c5b86495436434d9b6da2c09c33f5f97ce167365f941121f762
5
5
  SHA512:
6
- metadata.gz: 303b90200618be3000955230dd678f7caa83bdef3637d03fce5922b84dcc3085fe3e5da2101e3531432a3e6ec6b768bb14f969cc7d988f2aa3c458375c465d39
7
- data.tar.gz: dd28ef26a08a7d6138bf20bcf58a44e569bc3ad1a1eac7229611a97091a01e7aa455c1655ad98eb37d40d34562ab5b94e724f2cbf444ddfcd038384e41a56474
6
+ metadata.gz: 4879b458c00839752fe57237d8baf3847ce3f31df77b3f1a6efe482882f4bb2470916f8d347801baa8bb8000a9f4489d2a5b9e4925eb23c626d5a076626b0566
7
+ data.tar.gz: ebe9ba8f2e11dc363beadd8a5a996ce1a3ab327138b594d445b58476f04118aacc87b7514a58591b8b46217dbc8a7d132c776609957e22ec16fe9b46a316ea67
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- spree_vpago (2.1.9)
4
+ spree_vpago (2.2.0.pre.addpaymentlogger)
5
5
  faraday
6
6
  google-cloud-firestore
7
7
  spree_api (>= 4.5)
@@ -188,7 +188,7 @@ GEM
188
188
  faraday-http-cache (2.5.0)
189
189
  faraday (>= 0.8)
190
190
  faraday-net_http (3.0.2)
191
- faraday-retry (2.3.2)
191
+ faraday-retry (2.4.0)
192
192
  faraday (~> 2.0)
193
193
  ffaker (2.21.0)
194
194
  ffi (1.15.5)
@@ -44,14 +44,15 @@ module Spree
44
44
  return render_not_found unless @payment.present?
45
45
 
46
46
  unless @payment.order.paid?
47
- Vpago::PaymentProcessorJob.perform_later(
48
- payment_number: @payment.number
49
- )
47
+ enqueued_at = Time.now.to_f
48
+ log_enqueue_start(@payment, enqueued_at, return_params)
49
+
50
+ Vpago::PaymentProcessorJob.perform_later(payment_number: @payment.number, enqueued_at: enqueued_at)
50
51
  end
51
52
 
52
53
  render json: { status: :ok }, status: :ok
53
54
  rescue StandardError => e
54
- Rails.logger.error("Failed to enqueued payment processor job: #{params} #{e.message}")
55
+ log_enqueue_error(e)
55
56
  render json: { status: :internal_server_error, message: 'Failed to enqueue payment processor job' }, status: :internal_server_error
56
57
  end
57
58
 
@@ -62,14 +63,21 @@ module Spree
62
63
  @payment = Spree::Payment.find_by(number: params.dig(:data, :external_ref_id))
63
64
  return render_not_found unless @payment
64
65
 
65
- Vpago::PaymentProcessorJob.perform_later(payment_number: @payment.number) unless @payment.order.paid?
66
+ unless @payment.order.paid?
67
+ enqueued_at = Time.now.to_f
68
+ log_enqueue_start(@payment, enqueued_at)
69
+
70
+ Vpago::PaymentProcessorJob.perform_later(payment_number: @payment.number, enqueued_at: enqueued_at)
71
+ end
66
72
 
67
73
  render json: { status: { code: '000001', message: 'success' }, data: nil }, status: :ok
68
74
  rescue StandardError => e
69
- Rails.logger.error("Payment error: #{e.message}")
75
+ log_enqueue_error(e)
70
76
  render json: { status: :internal_server_error, message: 'Failed to enqueue payment processor job' }, status: :internal_server_error
71
77
  end
72
78
 
79
+ private
80
+
73
81
  def sanitize_return_params
74
82
  sanitized_params = params.permit!.to_h
75
83
 
@@ -92,5 +100,41 @@ module Spree
92
100
  format.json { render json: { status: :unauthorized }, status: :unauthorized }
93
101
  end
94
102
  end
103
+
104
+ def log_enqueue_start(payment, enqueued_at, return_params = {})
105
+ VpagoLogger.log(
106
+ event: 'vpago.payment_processor_job.enqueue',
107
+ data: {
108
+ payment_number: payment.number,
109
+ order_number: payment.order&.number,
110
+ request_id: request.request_id,
111
+ payment_method_type: payment.payment_method&.type,
112
+ payment_method_name: payment.payment_method&.name,
113
+ gateway: detect_payway_gateway_version(payment.payment_method),
114
+ tran_id: (return_params[:tran_id] || return_params['tran_id']),
115
+ enqueued_at: enqueued_at
116
+ }
117
+ )
118
+ end
119
+
120
+ def log_enqueue_error(error)
121
+ VpagoLogger.error(
122
+ event: 'vpago.payment_processor_job.enqueue.error',
123
+ data: {
124
+ request_id: request.request_id,
125
+ payment_number: @payment&.number,
126
+ error_class: error.class.name,
127
+ error_message: error.message
128
+ }
129
+ )
130
+ end
131
+
132
+ def detect_payway_gateway_version(payment_method)
133
+ return nil unless payment_method
134
+ return 'payway_v2' if payment_method.type_payway_v2?
135
+ return 'payway_v1' if payment_method.type_payway?
136
+
137
+ nil
138
+ end
95
139
  end
96
140
  end
@@ -4,7 +4,7 @@ module Spree
4
4
  skip_before_action :verify_authenticity_token, only: %i[return v2_return continue v2_continue]
5
5
 
6
6
  # match via: [:get, :post]
7
- # {"response"=>"{\"tran_id\":\"PE13LXT1\",\"status\":0"}"}
7
+ # {"response"=>"{\"tran_id\":\"PE13LXT1\",\"status\":0}"}
8
8
  def v2_return
9
9
  handler_service = v2_request_updater_service
10
10
 
@@ -48,7 +48,7 @@ module Spree
48
48
  request_updater.call
49
49
 
50
50
  order = payment.order
51
- order = order.reload
51
+ order.reload
52
52
 
53
53
  if order.paid? || payment.pending?
54
54
  render plain: :success
@@ -1,11 +1,71 @@
1
1
  # Put :payment_processing at a higher priority in your project: config/sidekiq.yml
2
+ require 'vpago/timing_helper'
3
+
2
4
  module Vpago
3
5
  class PaymentProcessorJob < ::ApplicationUniqueJob
4
6
  queue_as :payment_processing
5
7
 
6
8
  def perform(options)
9
+ started_at = Vpago::TimingHelper.current_time
10
+ enqueued_at = options[:enqueued_at]
11
+ queue_wait_ms = calculate_queue_wait_ms(enqueued_at)
12
+
13
+ log_job_start(options[:payment_number], queue_wait_ms)
14
+
7
15
  payment = Spree::Payment.find_by!(number: options[:payment_number])
8
16
  Vpago::PaymentProcessor.new(payment: payment).call
17
+
18
+ log_job_finish(options[:payment_number], queue_wait_ms, started_at)
19
+ rescue StandardError => e
20
+ log_job_error(options[:payment_number], queue_wait_ms, started_at, e)
21
+ raise
22
+ end
23
+
24
+ private
25
+
26
+ def calculate_queue_wait_ms(enqueued_at)
27
+ return nil unless enqueued_at
28
+
29
+ ((Time.now.to_f - enqueued_at.to_f) * 1000.0).round(1)
30
+ end
31
+
32
+ def log_job_start(payment_number, queue_wait_ms)
33
+ VpagoLogger.log(
34
+ event: 'vpago.payment_processor_job.start',
35
+ data: {
36
+ payment_number: payment_number,
37
+ queue: self.class.queue_name,
38
+ queue_wait_ms: queue_wait_ms
39
+ }
40
+ )
41
+ end
42
+
43
+ def log_job_finish(payment_number, queue_wait_ms, started_at)
44
+ runtime_ms = Vpago::TimingHelper.elapsed_ms(started_at)
45
+ VpagoLogger.log(
46
+ event: 'vpago.payment_processor_job.finish',
47
+ data: {
48
+ payment_number: payment_number,
49
+ queue: self.class.queue_name,
50
+ queue_wait_ms: queue_wait_ms,
51
+ runtime_ms: runtime_ms
52
+ }
53
+ )
54
+ end
55
+
56
+ def log_job_error(payment_number, queue_wait_ms, started_at, error)
57
+ runtime_ms = Vpago::TimingHelper.elapsed_ms(started_at)
58
+ VpagoLogger.error(
59
+ event: 'vpago.payment_processor_job.error',
60
+ data: {
61
+ payment_number: payment_number,
62
+ queue: self.class.queue_name,
63
+ queue_wait_ms: queue_wait_ms,
64
+ runtime_ms: runtime_ms,
65
+ error_class: error.class.name,
66
+ error_message: error.message
67
+ }
68
+ )
9
69
  end
10
70
  end
11
71
  end
@@ -0,0 +1,28 @@
1
+ module Vpago
2
+ module TimingHelper
3
+ # Gets the current monotonic timestamp.
4
+ #
5
+ # @return [Float] current timestamp from Process.clock_gettime(Process::CLOCK_MONOTONIC)
6
+ def self.current_time
7
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
8
+ end
9
+
10
+ # Measures elapsed time in milliseconds from a given start timestamp.
11
+ #
12
+ # @param started_at [Float] timestamp from Process.clock_gettime(Process::CLOCK_MONOTONIC)
13
+ # @return [Float] elapsed time in milliseconds, rounded to 1 decimal place
14
+ def self.elapsed_ms(started_at)
15
+ ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - started_at) * 1000.0).round(1)
16
+ end
17
+
18
+ # Yields to a block and measures its execution time in milliseconds.
19
+ #
20
+ # @yield the block to measure
21
+ # @return [Float] elapsed time in milliseconds, rounded to 1 decimal place
22
+ def self.measure_ms
23
+ started_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
24
+ yield
25
+ elapsed_ms(started_at)
26
+ end
27
+ end
28
+ end
@@ -1,7 +1,7 @@
1
1
  module SpreeVpago
2
2
  module_function
3
3
 
4
- VERSION = '2.1.9'.freeze
4
+ VERSION = '2.2.0-addpaymentlogger'.freeze
5
5
 
6
6
  def version
7
7
  Gem::Version.new VERSION
@@ -1,4 +1,5 @@
1
1
  require 'faraday'
2
+ require 'vpago/timing_helper'
2
3
 
3
4
  module Vpago
4
5
  module PaywayV2
@@ -35,6 +36,8 @@ module Vpago
35
36
  end
36
37
 
37
38
  def check_remote_status
39
+ started_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
40
+
38
41
  conn = Faraday::Connection.new do |faraday|
39
42
  faraday.request :url_encoded
40
43
  end
@@ -46,7 +49,33 @@ module Vpago
46
49
  hash: checker_hmac
47
50
  }
48
51
 
49
- conn.post(check_transaction_url, data)
52
+ response = conn.post(check_transaction_url, data)
53
+
54
+ runtime_ms = Vpago::TimingHelper.elapsed_ms(started_at)
55
+ Rails.logger.info(
56
+ {
57
+ event: 'vpago.payway.check_transaction',
58
+ version: 'v2',
59
+ payment_number: transaction_id,
60
+ http_status: response.status,
61
+ runtime_ms: runtime_ms
62
+ }
63
+ )
64
+
65
+ response
66
+ rescue StandardError => e
67
+ runtime_ms = Vpago::TimingHelper.elapsed_ms(started_at)
68
+ Rails.logger.error(
69
+ {
70
+ event: 'vpago.payway.check_transaction.error',
71
+ version: 'v2',
72
+ payment_number: transaction_id,
73
+ runtime_ms: runtime_ms,
74
+ error_class: e.class.name,
75
+ error_message: e.message
76
+ }
77
+ )
78
+ raise
50
79
  end
51
80
 
52
81
  def payout_total
@@ -0,0 +1,15 @@
1
+ module VpagoLogger
2
+ def self.log(event:, data: nil)
3
+ message = { event: event }
4
+ message.merge!(data) if data
5
+
6
+ Rails.logger.info(message.to_json)
7
+ end
8
+
9
+ def self.error(event:, data: nil)
10
+ message = { event: event }
11
+ message.merge!(data) if data
12
+
13
+ Rails.logger.error(message.to_json)
14
+ end
15
+ end
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.1.9
4
+ version: 2.2.0.pre.addpaymentlogger
5
5
  platform: ruby
6
6
  authors:
7
7
  - You
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-01-31 00:00:00.000000000 Z
11
+ date: 2026-02-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -188,6 +188,7 @@ files:
188
188
  - app/jobs/vpago/payment_capturer_job.rb
189
189
  - app/jobs/vpago/payment_processor_job.rb
190
190
  - app/jobs/vpago/payment_voider_job.rb
191
+ - app/lib/vpago/timing_helper.rb
191
192
  - app/models/.gitkeep
192
193
  - app/models/concerns/vpago/payoutable.rb
193
194
  - app/models/spree/gateway/acleda.rb
@@ -418,6 +419,7 @@ files:
418
419
  - lib/vpago/wing_sdk/payment_retriever.rb
419
420
  - lib/vpago/wing_sdk/transaction_status_checker.rb
420
421
  - lib/vpago/wing_sdk/transaction_status_response.rb
422
+ - lib/vpago_logger.rb
421
423
  - node_modules/.yarn-integrity
422
424
  - package-lock.json
423
425
  - package.json
@@ -439,9 +441,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
439
441
  version: 3.2.0
440
442
  required_rubygems_version: !ruby/object:Gem::Requirement
441
443
  requirements:
442
- - - ">="
444
+ - - ">"
443
445
  - !ruby/object:Gem::Version
444
- version: '0'
446
+ version: 1.3.1
445
447
  requirements:
446
448
  - none
447
449
  rubygems_version: 3.4.1