1
0
Fork 0
discourse-custom-wizard-unl.../lib/custom_wizard/notice/connection_error.rb
2021-11-17 20:26:44 +08:00

77 Zeilen
1,8 KiB
Ruby

# frozen_string_literal: true
class CustomWizard::Notice::ConnectionError
attr_reader :archetype
def initialize(archetype)
@archetype = archetype
end
def create!
if attrs = current_error
key = "#{archetype.to_s}_error_#{attrs[:id]}"
attrs[:updated_at] = Time.now
attrs[:count] = attrs[:count].to_i + 1
else
domain = CustomWizard::Notice.send("#{archetype.to_s}_domain")
id = SecureRandom.hex(8)
attrs = {
id: id,
message: I18n.t("wizard.notice.connection_error", domain: domain),
archetype: CustomWizard::Notice.archetypes[archetype.to_sym],
created_at: Time.now,
count: 1
}
key = "#{archetype.to_s}_error_#{id}"
end
PluginStore.set(namespace, key, attrs)
@current_error = nil
end
def expire!
if query = current_error(query_only: true)
record = query.first
error = JSON.parse(record.value)
error['expired_at'] = Time.now
record.value = error.to_json
record.save
end
end
def plugin_status_limit
5
end
def subscription_message_limit
10
end
def limit
self.send("#{archetype.to_s}_limit")
end
def reached_limit?
return false unless current_error.present?
current_error[:count].to_i >= limit
end
def namespace
"#{CustomWizard::PLUGIN_NAME}_notice_connection"
end
def current_error(query_only: false)
@current_error ||= begin
query = PluginStoreRow.where(plugin_name: namespace)
query = query.where("(value::json->>'archetype')::integer = ?", CustomWizard::Notice.archetypes[archetype.to_sym])
query = query.where("(value::json->>'expired_at') IS NULL")
return nil if !query.exists?
return query if query_only
JSON.parse(query.first.value).deep_symbolize_keys
end
end
end