Class: Desiru::Persistence::Models::JobResult

Inherits:
Base
  • Object
show all
Defined in:
lib/desiru/persistence/models/job_result.rb

Overview

Model for storing background job results

Constant Summary collapse

STATUS_PENDING =

Status constants

'pending'
STATUS_PROCESSING =
'processing'
STATUS_COMPLETED =
'completed'
STATUS_FAILED =
'failed'

Instance Method Summary collapse

Instance Method Details

#completed?Boolean

Returns:

  • (Boolean)


68
69
70
# File 'lib/desiru/persistence/models/job_result.rb', line 68

def completed?
  status == STATUS_COMPLETED
end

#durationObject



80
81
82
83
84
# File 'lib/desiru/persistence/models/job_result.rb', line 80

def duration
  return nil unless started_at && finished_at

  finished_at - started_at
end

#expired?Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/desiru/persistence/models/job_result.rb', line 76

def expired?
  expires_at && expires_at < Time.now
end

#failed?Boolean

Returns:

  • (Boolean)


72
73
74
# File 'lib/desiru/persistence/models/job_result.rb', line 72

def failed?
  status == STATUS_FAILED
end

#inputs_dataObject

JSON field accessors



87
88
89
90
91
92
93
# File 'lib/desiru/persistence/models/job_result.rb', line 87

def inputs_data
  return {} unless inputs

  JSON.parse(inputs, symbolize_names: true)
rescue JSON::ParserError
  {}
end

#mark_as_completed!(result_data, message: nil) ⇒ Object



111
112
113
114
115
116
117
118
119
# File 'lib/desiru/persistence/models/job_result.rb', line 111

def mark_as_completed!(result_data, message: nil)
  update(
    status: STATUS_COMPLETED,
    finished_at: Time.now,
    progress: 100,
    result: result_data.to_json,
    message: message
  )
end

#mark_as_failed!(error, backtrace: nil) ⇒ Object



121
122
123
124
125
126
127
128
# File 'lib/desiru/persistence/models/job_result.rb', line 121

def mark_as_failed!(error, backtrace: nil)
  update(
    status: STATUS_FAILED,
    finished_at: Time.now,
    error_message: error.to_s,
    error_backtrace: backtrace&.join("\n")
  )
end

#mark_as_processing!Object



103
104
105
106
107
108
109
# File 'lib/desiru/persistence/models/job_result.rb', line 103

def mark_as_processing!
  update(
    status: STATUS_PROCESSING,
    started_at: Time.now,
    progress: 0
  )
end

#pending?Boolean

Instance methods

Returns:

  • (Boolean)


60
61
62
# File 'lib/desiru/persistence/models/job_result.rb', line 60

def pending?
  status == STATUS_PENDING
end

#processing?Boolean

Returns:

  • (Boolean)


64
65
66
# File 'lib/desiru/persistence/models/job_result.rb', line 64

def processing?
  status == STATUS_PROCESSING
end

#result_dataObject



95
96
97
98
99
100
101
# File 'lib/desiru/persistence/models/job_result.rb', line 95

def result_data
  return {} unless result

  JSON.parse(result, symbolize_names: true)
rescue JSON::ParserError
  {}
end

#update_progress(progress, message: nil) ⇒ Object



130
131
132
133
134
# File 'lib/desiru/persistence/models/job_result.rb', line 130

def update_progress(progress, message: nil)
  updates = { progress: progress }
  updates[:message] = message if message
  update(updates)
end

#validateObject

Validations



17
18
19
20
21
22
# File 'lib/desiru/persistence/models/job_result.rb', line 17

def validate
  super
  validates_presence i[job_id job_class queue status enqueued_at]
  validates_unique :job_id if db&.table_exists?(:job_results)
  validates_includes %w[pending processing completed failed], :status
end