Module: ActsAsJobStatus

Extended by:
ActiveSupport::Concern
Defined in:
app/models/concerns/acts_as_job_status.rb

Overview

ActsAsJobStatus

Tracks the status of background jobs. Intended to be used in a wizard.

Mark your model with ‘acts_as_job_status’

Add the the following columns

job_status :string job_started_at :datetime job_ended_at :datetime job_error :text

Use with_job_status in your background job

Defined Under Namespace

Modules: Base, ClassMethods

Instance Method Summary collapse

Instance Method Details

#job_status_completed?Boolean

Returns:

  • (Boolean)


62
63
64
# File 'app/models/concerns/acts_as_job_status.rb', line 62

def job_status_completed?
  job_status == 'completed'
end

#job_status_completed_items_countObject



46
47
48
# File 'app/models/concerns/acts_as_job_status.rb', line 46

def job_status_completed_items_count
  nil
end

#job_status_display_item_counts?Boolean

Returns:

  • (Boolean)


42
43
44
# File 'app/models/concerns/acts_as_job_status.rb', line 42

def job_status_display_item_counts?
  job_status_completed_items_count.present? && job_status_total_items_count.present?
end

#job_status_enqueued?Boolean

Returns:

  • (Boolean)


54
55
56
# File 'app/models/concerns/acts_as_job_status.rb', line 54

def job_status_enqueued?
  job_status == 'enqueued'
end

#job_status_error?Boolean

Returns:

  • (Boolean)


66
67
68
# File 'app/models/concerns/acts_as_job_status.rb', line 66

def job_status_error?
  job_status == 'error'
end

#job_status_running?Boolean

Returns:

  • (Boolean)


58
59
60
# File 'app/models/concerns/acts_as_job_status.rb', line 58

def job_status_running?
  job_status == 'running'
end

#job_status_total_items_countObject



50
51
52
# File 'app/models/concerns/acts_as_job_status.rb', line 50

def job_status_total_items_count
  nil
end

#perform_with_job_status!(&block) ⇒ Object

Instance Methods



34
35
36
37
38
39
40
# File 'app/models/concerns/acts_as_job_status.rb', line 34

def perform_with_job_status!(&block)
  assign_attributes(job_status: nil, job_started_at: nil, job_ended_at: nil, job_error: nil)

  after_commit { yield }

  save!
end

#with_job_status(&block) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'app/models/concerns/acts_as_job_status.rb', line 70

def with_job_status(&block)
  self.class.where(id: id).update_all(
    job_status: :running,
    job_started_at: Time.zone.now,
    job_ended_at: nil,
    job_error: nil
  )

  exception = nil
  job_status = nil
  job_error = nil

  begin
    success = yield
    raise('Unexpected error') unless success

    job_status = :completed
  rescue Exception => e
    exception = e
    job_status = :error
    job_error = e.message.presence || 'Unexpected error'
  end

  self.class.where(id: id).update_all(
    job_status: job_status, 
    job_ended_at: Time.zone.now, 
    job_error: job_error
  )

  if job_status == :error
    EffectiveLogger.error(exception.message, associated: self) if defined?(EffectiveLogger)
    ExceptionNotifier.notify_exception(exception, data: { id: id, class_name: self.class.name }) if defined?(ExceptionNotifier)
  end

  if job_status == :error && !ENV['TESTING_ACTS_AS_JOB_STATUS']
    raise(exception) unless Rails.env.production? || Rails.env.staging?
  end

  true
end