class ApplicationJob < ActiveJob::Base
  # Automatically retry jobs that encountered a deadlock
  # retry_on ActiveRecord::Deadlocked

  # Most jobs are safe to ignore if the underlying records are no longer available
  # discard_on ActiveJob::DeserializationError

  # We (currently) rely on Delayed::Job#attempts to check for stuck backends
  # e.g. in the MonitoringController.
  # This is a workaround to sync ActiveJob#executions to Delayed::Job#attempts
  # until we resolve this dependency.
  after_enqueue do |job|
    # skip update of `attempts` attribute if job wasn't queued because of ActiveJobLock
    #(another job with same lock key got queued before this job could be retried)
    next if job.provider_job_id.blank?

    # update the column right away without loading Delayed::Job record
    # see: https://stackoverflow.com/a/34264580
    Delayed::Job.where(id: job.provider_job_id).update_all(attempts: job.executions) # rubocop:disable Rails/SkipsModelValidations
  end
end
