discourse/app/jobs/onceoff/onceoff.rb
Krzysztof Kotlarek 427d54b2b0 DEV: Upgrading Discourse to Zeitwerk (#8098)
Zeitwerk simplifies working with dependencies in dev and makes it easier reloading class chains. 

We no longer need to use Rails "require_dependency" anywhere and instead can just use standard 
Ruby patterns to require files.

This is a far reaching change and we expect some followups here.
2019-10-02 14:01:53 +10:00

46 lines
1.1 KiB
Ruby

# frozen_string_literal: true
require_relative '../base.rb'
class Jobs::Onceoff < ::Jobs::Base
sidekiq_options retry: false
def self.name_for(klass)
klass.name.sub(/^Jobs\:\:/, '')
end
def running_key_name
"#{self.class.name}:running"
end
# Pass `force: true` to force it happen again
def execute(args)
job_name = self.class.name_for(self.class)
has_lock = $redis.setnx(running_key_name, Time.now.to_i)
# If we can't get a lock, just noop
if args[:force] || has_lock
begin
return if OnceoffLog.where(job_name: job_name).exists? && !args[:force]
execute_onceoff(args)
OnceoffLog.create!(job_name: job_name)
ensure
$redis.del(running_key_name) if has_lock
end
end
end
def self.enqueue_all
previously_ran = OnceoffLog.pluck(:job_name).uniq
ObjectSpace.each_object(Class).select { |klass| klass < self }.each do |klass|
job_name = name_for(klass)
unless previously_ran.include?(job_name)
Jobs.enqueue(job_name.underscore.to_sym)
end
end
end
end