0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-06 13:08:40 +08:00
discourse/plugins/automation/app/services/discourse_automation/destroy.rb
Régis Hanol e70137509e
DEV: Refactor automation Update service per PR #36458 feedback (#36771)
Addresses code review feedback to improve the automation Update service
by following Discourse service best practices and extracting complex
logic into a dedicated action class.

Changes:
- Extract logging logic to
`DiscourseAutomation::Action::LogAutomationUpdate` action class,
removing utility methods from the service (per service guidelines that
discourage utility methods in services)
- Use `model` step for `previous_state` instead of regular step
- Simplify `capture_previous_state` using `slice` and `merge`
- Pass `previous_state` as explicit parameter to `log_action`
- Remove unused `params` from `apply_forced_triggerable`
- Simplify attributes building with
`symbolize_keys.slice().compact_blank`
- Simplify save logic: `save!(validate: context[:clear_trigger].blank?)`
- Use `index_with` for building change hashes in action class
- Use `have_attributes` matcher in request specs
- Simplify boolean checks with `value.in?([true, false])`

References:
- PR feedback: https://github.com/discourse/discourse/pull/36458
- Service objects guide:
https://meta.discourse.org/t/using-service-objects-in-discourse/333641
2025-12-18 18:16:03 +01:00

46 lines
977 B
Ruby
Vendored

# frozen_string_literal: true
class DiscourseAutomation::Destroy
include Service::Base
# @!method self.call(guardian:, params:)
# @param [Guardian] guardian
# @param [Hash] params
# @option params [Integer] :automation_id
# @return [Service::Base::Context]
policy :can_destroy_automation
params do
attribute :automation_id, :integer
validates :automation_id, presence: true
end
model :automation
transaction do
step :log_action
step :destroy_automation
end
private
def can_destroy_automation(guardian:)
guardian.is_admin?
end
def fetch_automation(params:)
DiscourseAutomation::Automation.find_by(id: params.automation_id)
end
def log_action(automation:, guardian:)
StaffActionLogger.new(guardian.user).log_custom(
"delete_automation",
automation.slice(:id, :name, :script, :trigger).compact_blank,
)
end
def destroy_automation(automation:)
automation.destroy!
end
end