From ea7e12c3f871afa18ff6cc7e8936534b6d08a017 Mon Sep 17 00:00:00 2001 From: Rosa Gutierrez Date: Tue, 26 Dec 2023 20:39:50 +0100 Subject: [PATCH] Extract Job::Schedulable concern from Job::Executable --- app/models/solid_queue/job/executable.rb | 10 ++---- app/models/solid_queue/job/schedulable.rb | 44 +++++++++++++++++++++++ 2 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 app/models/solid_queue/job/schedulable.rb diff --git a/app/models/solid_queue/job/executable.rb b/app/models/solid_queue/job/executable.rb index 8f687af9..c098b550 100644 --- a/app/models/solid_queue/job/executable.rb +++ b/app/models/solid_queue/job/executable.rb @@ -6,14 +6,12 @@ module Executable extend ActiveSupport::Concern included do - include Clearable, ConcurrencyControls + include Clearable, ConcurrencyControls, Schedulable has_one :ready_execution, dependent: :destroy has_one :claimed_execution, dependent: :destroy has_one :failed_execution, dependent: :destroy - has_one :scheduled_execution, dependent: :destroy - after_create :prepare_for_execution scope :finished, -> { where.not(finished_at: nil) } @@ -70,7 +68,7 @@ def successfully_scheduled(jobs) end end - %w[ ready claimed failed scheduled ].each do |status| + %w[ ready claimed failed ].each do |status| define_method("#{status}?") { public_send("#{status}_execution").present? } end @@ -117,10 +115,6 @@ def failed_with(exception) end private - def schedule - ScheduledExecution.create_or_find_by!(job_id: id) - end - def ready ReadyExecution.create_or_find_by!(job_id: id) end diff --git a/app/models/solid_queue/job/schedulable.rb b/app/models/solid_queue/job/schedulable.rb new file mode 100644 index 00000000..e82af6c1 --- /dev/null +++ b/app/models/solid_queue/job/schedulable.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +module SolidQueue + class Job + module Schedulable + extend ActiveSupport::Concern + + included do + has_one :scheduled_execution, dependent: :destroy + + scope :scheduled, -> { where.not(finished_at: nil) } + end + + class_methods do + def schedule_all(jobs) + schedule_all_at_once(jobs) + successfully_scheduled(jobs) + end + + private + def schedule_all_at_once(jobs) + ScheduledExecution.create_all_from_jobs(jobs) + end + + def successfully_scheduled(jobs) + where(id: ScheduledExecution.where(job_id: jobs.map(&:id)).pluck(:job_id)) + end + end + + def scheduled? + scheduled_execution.present? + end + + def due? + scheduled_at.nil? || scheduled_at <= Time.current + end + + private + def schedule + ScheduledExecution.create_or_find_by!(job_id: id) + end + end + end +end