Class: Solrengine::Transactions::ConfirmationJob

Inherits:
ActiveJob::Base
  • Object
show all
Defined in:
app/jobs/solrengine/transactions/confirmation_job.rb

Constant Summary collapse

MAX_ATTEMPTS =
30
BACKOFF_SCHEDULE =
[ 2, 4, 8, 8, 8 ].freeze

Instance Method Summary collapse

Instance Method Details

#perform(transfer_id, attempt: 0) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'app/jobs/solrengine/transactions/confirmation_job.rb', line 9

def perform(transfer_id, attempt: 0)
  transfer = Solrengine::Transactions.transfer_model
    .lock
    .includes(:user)
    .find_by(id: transfer_id)
  return unless transfer&.signature
  return if transfer.confirmed? || transfer.failed?

  status_info = fetch_status(transfer.signature)

  if status_info.nil?
    if attempt < MAX_ATTEMPTS
      self.class.set(wait: wait_for(attempt)).perform_later(transfer_id, attempt: attempt + 1)
    else
      transfer.update!(status: "failed", error_message: "Transaction not confirmed after #{MAX_ATTEMPTS} attempts")
      broadcast_status(transfer)
    end
    return
  end

  if status_info["err"]
    transfer.update!(status: "failed", error_message: status_info["err"].to_s.truncate(500))
  else
    confirmation = status_info["confirmationStatus"]
    new_status = Transferable::VALID_STATUSES.include?(confirmation) ? confirmation : "confirmed"
    transfer.update!(status: new_status)

    if confirmation == "processed" || confirmation == "confirmed"
      self.class.set(wait: wait_for(attempt)).perform_later(transfer_id, attempt: attempt + 1)
    end
  end

  broadcast_status(transfer)
end