mirror of
https://github.com/discourse/discourse.git
synced 2024-11-26 06:13:38 +08:00
2211ffa851
There are a couple of reasons for this. The first one is practical, and related to eager loading. Since /lib is not eager loaded, when the application boots, ProblemCheck["identifier"] will be nil because the child classes aren't loaded. The second one is more conceptual. There turns out to be a lot of inter-dependencies between the part of the problem check system that live in /app and the parts that live in /lib, which probably suggests it should all go in /app.
77 lines
1.6 KiB
Ruby
77 lines
1.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class ProblemCheck
|
|
include ActiveSupport::Configurable
|
|
|
|
config_accessor :priority, default: "low", instance_writer: false
|
|
|
|
# Determines if the check should be performed at a regular interval, and if
|
|
# so how often. If left blank, the check will be performed every time the
|
|
# admin dashboard is loaded, or the data is otherwise requested.
|
|
#
|
|
config_accessor :perform_every, default: nil, instance_writer: false
|
|
|
|
# How many times the check should retry before registering a problem. Only
|
|
# works for scheduled checks.
|
|
#
|
|
config_accessor :max_retries, default: 2, instance_writer: false
|
|
|
|
# The retry delay after a failed check. Only works for scheduled checks with
|
|
# more than one retry configured.
|
|
#
|
|
config_accessor :retry_after, default: 30.seconds, instance_writer: false
|
|
|
|
def self.[](key)
|
|
key = key.to_sym
|
|
|
|
checks.find { |c| c.identifier == key }
|
|
end
|
|
|
|
def self.checks
|
|
descendants
|
|
end
|
|
|
|
def self.scheduled
|
|
checks.select(&:scheduled?)
|
|
end
|
|
|
|
def self.identifier
|
|
name.demodulize.underscore.to_sym
|
|
end
|
|
delegate :identifier, to: :class
|
|
|
|
def self.scheduled?
|
|
perform_every.present?
|
|
end
|
|
delegate :scheduled?, to: :class
|
|
|
|
def self.call
|
|
new.call
|
|
end
|
|
|
|
def call
|
|
raise NotImplementedError
|
|
end
|
|
|
|
private
|
|
|
|
def problem
|
|
[
|
|
Problem.new(
|
|
I18n.t(translation_key, base_path: Discourse.base_path),
|
|
priority: self.config.priority,
|
|
identifier:,
|
|
),
|
|
]
|
|
end
|
|
|
|
def no_problem
|
|
[]
|
|
end
|
|
|
|
def translation_key
|
|
# TODO: Infer a default based on class name, then move translations in locale file.
|
|
raise NotImplementedError
|
|
end
|
|
end
|