Class: Desiru::Persistence::Repositories::JobResultRepository

Inherits:
BaseRepository
  • Object
show all
Defined in:
lib/desiru/persistence/repositories/job_result_repository.rb

Overview

Repository for job result persistence

Instance Attribute Summary

Attributes inherited from BaseRepository

#model_class

Instance Method Summary collapse

Methods inherited from BaseRepository

#all, #count, #create, #delete?, #exists?, #find, #find_by, #paginate, #update, #where

Constructor Details

#initializeJobResultRepository

Returns a new instance of JobResultRepository.



10
11
12
# File 'lib/desiru/persistence/repositories/job_result_repository.rb', line 10

def initialize
  super(Models::JobResult)
end

Instance Method Details

#cleanup_expiredObject



71
72
73
# File 'lib/desiru/persistence/repositories/job_result_repository.rb', line 71

def cleanup_expired
  dataset.expired.delete
end

#create_for_job(job_id, job_class, queue, inputs: nil, expires_at: nil) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
# File 'lib/desiru/persistence/repositories/job_result_repository.rb', line 14

def create_for_job(job_id, job_class, queue, inputs: nil, expires_at: nil)
  create(
    job_id: job_id,
    job_class: job_class,
    queue: queue,
    status: Models::JobResult::STATUS_PENDING,
    inputs: inputs&.to_json,
    enqueued_at: Time.now,
    expires_at: expires_at
  )
end

#find_by_job_id(job_id) ⇒ Object



26
27
28
# File 'lib/desiru/persistence/repositories/job_result_repository.rb', line 26

def find_by_job_id(job_id)
  find_by(job_id: job_id)
end

#mark_completed(job_id, result, message: nil) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/desiru/persistence/repositories/job_result_repository.rb', line 38

def mark_completed(job_id, result, message: nil)
  job_result = find_by_job_id(job_id)
  return nil unless job_result

  job_result.mark_as_completed!(result, message: message)
  job_result
end

#mark_failed(job_id, error, backtrace: nil, increment_retry: true) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/desiru/persistence/repositories/job_result_repository.rb', line 46

def mark_failed(job_id, error, backtrace: nil, increment_retry: true)
  job_result = find_by_job_id(job_id)
  return nil unless job_result

  updates = {
    status: Models::JobResult::STATUS_FAILED,
    finished_at: Time.now,
    error_message: error.to_s,
    error_backtrace: backtrace&.join("\n")
  }

  updates[:retry_count] = job_result.retry_count + 1 if increment_retry

  job_result.update(updates)
  job_result
end

#mark_processing(job_id) ⇒ Object



30
31
32
33
34
35
36
# File 'lib/desiru/persistence/repositories/job_result_repository.rb', line 30

def mark_processing(job_id)
  job_result = find_by_job_id(job_id)
  return nil unless job_result

  job_result.mark_as_processing!
  job_result
end

#recent_by_class(job_class, limit: 10) ⇒ Object



75
76
77
# File 'lib/desiru/persistence/repositories/job_result_repository.rb', line 75

def recent_by_class(job_class, limit: 10)
  dataset.by_job_class(job_class).recent(limit).all
end

#statistics(job_class: nil, since: nil) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/desiru/persistence/repositories/job_result_repository.rb', line 79

def statistics(job_class: nil, since: nil)
  scope = dataset
  scope = scope.by_job_class(job_class) if job_class
  scope = scope.where { created_at >= since } if since

  {
    total: scope.count,
    pending: scope.pending.count,
    processing: scope.processing.count,
    completed: scope.completed.count,
    failed: scope.failed.count,
    average_duration: calculate_average_duration(scope)
  }
end

#update_progress(job_id, progress, message: nil) ⇒ Object



63
64
65
66
67
68
69
# File 'lib/desiru/persistence/repositories/job_result_repository.rb', line 63

def update_progress(job_id, progress, message: nil)
  job_result = find_by_job_id(job_id)
  return nil unless job_result

  job_result.update_progress(progress, message: message)
  job_result
end