diff --git a/plugins/automation/app/controllers/discourse_automation/admin_automations_controller.rb b/plugins/automation/app/controllers/discourse_automation/admin_automations_controller.rb index 908fd467aa6..84ee5af2ee5 100644 --- a/plugins/automation/app/controllers/discourse_automation/admin_automations_controller.rb +++ b/plugins/automation/app/controllers/discourse_automation/admin_automations_controller.rb @@ -5,7 +5,13 @@ module DiscourseAutomation requires_plugin DiscourseAutomation::PLUGIN_NAME def index - automations = DiscourseAutomation::Automation.order(:name).all + automations = + DiscourseAutomation::Automation + .strict_loading + .includes(:fields, :pending_automations) + .order(:name) + .limit(500) + .all serializer = ActiveModel::ArraySerializer.new( automations, @@ -19,7 +25,8 @@ module DiscourseAutomation end def show - automation = DiscourseAutomation::Automation.find(params[:id]) + automation = + DiscourseAutomation::Automation.includes(:fields, :pending_automations).find(params[:id]) render_serialized_automation(automation) end @@ -43,7 +50,8 @@ module DiscourseAutomation def update params.require(:automation) - automation = DiscourseAutomation::Automation.find(params[:id]) + automation = + DiscourseAutomation::Automation.includes(:fields, :pending_automations).find(params[:id]) if automation.scriptable.forced_triggerable params[:trigger] = automation.scriptable.forced_triggerable[:triggerable].to_s end diff --git a/plugins/automation/app/models/discourse_automation/automation.rb b/plugins/automation/app/models/discourse_automation/automation.rb index 8df2b6b96d2..cc0efd5f7ae 100644 --- a/plugins/automation/app/models/discourse_automation/automation.rb +++ b/plugins/automation/app/models/discourse_automation/automation.rb @@ -7,7 +7,8 @@ module DiscourseAutomation has_many :fields, class_name: "DiscourseAutomation::Field", dependent: :delete_all, - foreign_key: "automation_id" + foreign_key: "automation_id", + inverse_of: :automation has_many :pending_automations, class_name: "DiscourseAutomation::PendingAutomation", dependent: :delete_all, @@ -28,6 +29,16 @@ module DiscourseAutomation attr_accessor :running_in_background + def trigger=(new_trigger) + @triggerable = nil + super + end + + def script=(new_script) + @scriptable = nil + super + end + def running_in_background! @running_in_background = true end diff --git a/plugins/automation/app/models/discourse_automation/field.rb b/plugins/automation/app/models/discourse_automation/field.rb index 601773b6cc7..d1de3b553fa 100644 --- a/plugins/automation/app/models/discourse_automation/field.rb +++ b/plugins/automation/app/models/discourse_automation/field.rb @@ -4,7 +4,10 @@ module DiscourseAutomation class Field < ActiveRecord::Base self.table_name = "discourse_automation_fields" - belongs_to :automation, class_name: "DiscourseAutomation::Automation" + belongs_to :automation, + class_name: "DiscourseAutomation::Automation", + foreign_key: :automation_id, + inverse_of: :fields around_save :on_update_callback diff --git a/plugins/automation/app/serializers/discourse_automation/automation_serializer.rb b/plugins/automation/app/serializers/discourse_automation/automation_serializer.rb index ad42aad8a48..cb5921dc174 100644 --- a/plugins/automation/app/serializers/discourse_automation/automation_serializer.rb +++ b/plugins/automation/app/serializers/discourse_automation/automation_serializer.rb @@ -61,7 +61,7 @@ module DiscourseAutomation not_found: scriptable.not_found, templates: process_templates(filter_fields_with_priority(scriptable.fields, object.trigger&.to_sym)), - fields: process_fields(object.fields.where(target: "script")), + fields: process_fields(script_fields), } end @@ -80,7 +80,7 @@ module DiscourseAutomation doc: I18n.exists?(doc_key, :en) ? I18n.t(doc_key) : nil, not_found: triggerable&.not_found, templates: process_templates(triggerable&.fields || []), - fields: process_fields(object.fields.where(target: "trigger")), + fields: process_fields(trigger_fields), settings: triggerable&.settings, } end @@ -141,6 +141,14 @@ module DiscourseAutomation ).as_json || [] end + def script_fields + object.fields.select { |f| f.target == "script" } + end + + def trigger_fields + object.fields.select { |f| f.target == "trigger" } + end + def scriptable object.scriptable end diff --git a/plugins/automation/config/locales/server.en.yml b/plugins/automation/config/locales/server.en.yml index 804d431290a..31767f806dc 100644 --- a/plugins/automation/config/locales/server.en.yml +++ b/plugins/automation/config/locales/server.en.yml @@ -5,7 +5,7 @@ en: models: fields: required_field: Field `%{name}` must be filled on `%{target}:%{target_name}`. - invalid_field: Field’s component `%{component}` is not usable on `%{target}:%{target_name}.` + invalid_field: Field’s component `%{component}` is not usable on `%{target}:%{target_name}`. invalid_metadata: Data for `%{field}` is invalid or component `%{component}` is unknown. triggerables: errors: