0
0
Fork 1
Spiegel von https://github.com/paviliondev/discourse-custom-wizard.git synchronisiert 2024-11-10 04:12:53 +01:00
discourse-custom-wizard/lib/custom_wizard/validators/template.rb

137 Zeilen
3,2 KiB
Ruby

2021-03-11 07:30:15 +01:00
# frozen_string_literal: true
class CustomWizard::TemplateValidator
2020-11-03 01:24:20 +01:00
include HasErrors
include ActiveModel::Model
2021-03-11 07:30:15 +01:00
def initialize(data, opts = {})
2020-11-03 01:24:20 +01:00
@data = data
2020-04-13 14:17:22 +02:00
@opts = opts
2021-08-10 11:00:42 +02:00
@pro = CustomWizard::Pro.new
2020-04-13 14:17:22 +02:00
end
2021-03-11 07:30:15 +01:00
2020-04-13 14:17:22 +02:00
def perform
2020-11-03 01:24:20 +01:00
data = @data
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
check_id(data, :wizard)
check_required(data, :wizard)
validate_after_time
2021-08-10 11:00:42 +02:00
validate_pro(data, :wizard)
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
data[:steps].each do |step|
check_required(step, :step)
2021-08-10 11:00:42 +02:00
validate_pro(step, :step)
2021-03-11 07:30:15 +01:00
2021-09-07 14:06:13 +02:00
if step[:fields].present?
step[:fields].each do |field|
2021-08-10 11:00:42 +02:00
validate_pro(field, :field)
2020-11-03 01:24:20 +01:00
check_required(field, :field)
2020-04-13 14:17:22 +02:00
end
end
end
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
if data[:actions].present?
data[:actions].each do |action|
2021-09-03 10:46:32 +02:00
validate_pro(action, :action)
2020-11-03 01:24:20 +01:00
check_required(action, :action)
end
end
2021-03-11 07:30:15 +01:00
if errors.any?
2020-11-03 01:24:20 +01:00
false
2020-04-13 14:17:22 +02:00
else
2020-11-03 01:24:20 +01:00
true
2020-04-13 14:17:22 +02:00
end
end
2021-03-11 07:30:15 +01:00
2020-04-13 14:17:22 +02:00
def self.required
{
wizard: ['id', 'name', 'steps'],
step: ['id'],
field: ['id', 'type'],
action: ['id', 'type']
}
end
2021-03-11 07:30:15 +01:00
2021-08-10 11:00:42 +02:00
def self.pro
{
2021-09-14 05:33:16 +02:00
wizard: {
save_submissions: 'false',
restart_on_revisit: 'true',
},
2021-09-01 04:19:00 +02:00
step: {
condition: 'present',
2021-09-14 05:33:16 +02:00
index: 'conditional',
required_data: 'present',
permitted_params: 'present'
2021-09-01 04:19:00 +02:00
},
field: {
condition: 'present',
index: 'conditional'
},
action: {
type: %w[
send_message
2021-09-07 14:06:13 +02:00
add_to_group
2021-09-01 04:19:00 +02:00
create_category
create_group
send_to_api
]
}
2021-08-10 11:00:42 +02:00
}
end
2020-04-13 14:17:22 +02:00
private
2021-03-11 07:30:15 +01:00
2020-04-13 14:17:22 +02:00
def check_required(object, type)
2021-09-01 04:19:00 +02:00
self.class.required[type].each do |property|
2020-04-13 14:17:22 +02:00
if object[property].blank?
2021-03-11 07:30:15 +01:00
errors.add :base, I18n.t("wizard.validation.required", property: property)
2020-04-13 14:17:22 +02:00
end
end
end
2020-11-03 01:24:20 +01:00
2021-08-10 11:00:42 +02:00
def validate_pro(object, type)
2021-09-01 04:19:00 +02:00
self.class.pro[type].each do |property, pro_type|
2021-09-14 05:33:16 +02:00
val = object[property.to_s]
is_pro = (val != nil) && (
pro_type === 'present' && val.present? ||
(['true', 'false'].include?(pro_type) && cast_bool(val) == cast_bool(pro_type)) ||
(pro_type === 'conditional' && val.is_a?(Hash)) ||
(pro_type.is_a?(Array) && pro_type.include?(val))
2021-09-07 14:06:13 +02:00
)
2021-09-01 04:19:00 +02:00
2021-09-07 14:06:13 +02:00
if is_pro && !@pro.subscribed?
2021-09-01 04:19:00 +02:00
errors.add :base, I18n.t("wizard.validation.pro", type: type.to_s, property: property)
2021-08-10 11:00:42 +02:00
end
end
end
2020-04-13 14:17:22 +02:00
def check_id(object, type)
2020-10-31 08:05:50 +01:00
if type === :wizard && @opts[:create] && CustomWizard::Template.exists?(object[:id])
errors.add :base, I18n.t("wizard.validation.conflict", wizard_id: object[:id])
2020-04-13 14:17:22 +02:00
end
end
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
def validate_after_time
return unless @data[:after_time]
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
wizard = CustomWizard::Wizard.create(@data[:id]) if !@opts[:create]
2020-04-14 01:39:21 +02:00
current_time = wizard.present? ? wizard.after_time_scheduled : nil
2020-11-03 01:24:20 +01:00
new_time = @data[:after_time_scheduled]
2021-03-11 07:30:15 +01:00
2020-04-14 07:46:06 +02:00
begin
active_time = Time.parse(new_time.present? ? new_time : current_time).utc
rescue ArgumentError
invalid_time = true
end
2020-04-13 14:17:22 +02:00
2020-04-14 07:46:06 +02:00
if invalid_time || active_time.blank? || active_time < Time.now.utc
errors.add :base, I18n.t("wizard.validation.after_time")
2020-04-13 14:17:22 +02:00
end
end
2021-09-14 05:33:16 +02:00
def cast_bool(val)
ActiveRecord::Type::Boolean.new.cast(val)
end
2021-03-11 07:30:15 +01:00
end