Class: RailsNexus::CronJob

Inherits:
BaseRecord show all
Defined in:
app/models/rails_nexus/cron_job.rb

Constant Summary collapse

STATUSES =
%w[pending running success failed].freeze

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from BaseRecord

separate_database?

Class Method Details

.start!(name, metadata: {}) ⇒ Object

Start a new cron job run



21
22
23
24
25
26
27
28
29
# File 'app/models/rails_nexus/cron_job.rb', line 21

def self.start!(name, metadata: {})
  create!(
    name: name,
    status: "running",
    started_at: Time.current,
    hostname: Socket.gethostname,
    metadata: 
  )
end

.success_rate(days: 7) ⇒ Object

Success rate over last N days



64
65
66
67
68
69
70
# File 'app/models/rails_nexus/cron_job.rb', line 64

def self.success_rate(days: 7)
  recent_jobs = where("created_at >= ?", days.days.ago)
  total = recent_jobs.count
  return 0 if total == 0

  (recent_jobs.successful.count.to_f / total * 100).round(1)
end

.summaryObject

Stats summary



52
53
54
55
56
57
58
59
60
61
# File 'app/models/rails_nexus/cron_job.rb', line 52

def self.summary
  {
    total: count,
    successful: successful.count,
    failed: failed.count,
    running: running.count,
    last_run: recent.first,
    failure_rate: count > 0 ? (failed.count.to_f / count * 100).round(1) : 0
  }
end

Instance Method Details

#fail!(error: nil, duration: nil) ⇒ Object

Mark as failed



42
43
44
45
46
47
48
49
# File 'app/models/rails_nexus/cron_job.rb', line 42

def fail!(error: nil, duration: nil)
  update!(
    status: "failed",
    finished_at: Time.current,
    error_message: error,
    duration: duration || ((finished_at || Time.current) - (started_at || created_at))
  )
end

#succeed!(output: nil, duration: nil) ⇒ Object

Mark as successful



32
33
34
35
36
37
38
39
# File 'app/models/rails_nexus/cron_job.rb', line 32

def succeed!(output: nil, duration: nil)
  update!(
    status: "success",
    finished_at: Time.current,
    output: output,
    duration: duration || ((finished_at || Time.current) - (started_at || created_at))
  )
end