0
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2026-08-08 13:25:19 +08:00
discourse/app/services/site_setting/upsert_groups.rb
Jarek Radosz 8baf4d5d4c
DEV: Enable Style/RedundantSelf rubocop rule (#40098)
(to be enabled in the shared config)
2026-05-19 19:27:45 +02:00

88 lines
2.2 KiB
Ruby
Vendored

# frozen_string_literal: true
class SiteSetting::UpsertGroups
include Service::Base
params do
before_validation { self.group_names = Array.wrap(group_names).delete_if(&:empty?) }
attribute :group_names, :array
attribute :setting, :string
validates :setting, presence: true
end
policy :current_user_is_admin
policy :allowed_enabled_for_target
only_if(:provided_group_names) do
model :group_ids
transaction do
step :upsert_site_setting_groups
step :log_site_setting_groups_change
end
end
only_if(:no_provided_group_names) do
transaction do
step :delete_site_setting_group
step :log_site_setting_groups_change
end
end
step :notify_changed
private
def provided_group_names(params:)
params.group_names.present?
end
def no_provided_group_names(params:)
!provided_group_names(params:)
end
def current_user_is_admin(guardian:)
guardian.is_admin?
end
def allowed_enabled_for_target(params:)
return true if params.group_names.empty?
target = params.group_names == ["staff"] ? :staff : :specific_groups
UpcomingChanges.target_allowed?(params.setting, target)
end
def fetch_group_ids(params:)
Group.where(name: params.group_names).pluck(:id)
end
def upsert_site_setting_groups(params:, group_ids:, guardian:)
context[:previous_value] = SiteSettingGroup.find_by(name: params.setting)&.group_ids
context[:new_value] = group_ids.sort.join("|")
SiteSettingGroup.upsert(
{ name: params.setting, group_ids: context[:new_value] },
unique_by: :name,
)
end
def delete_site_setting_group(params:, guardian:)
previous_record = SiteSettingGroup.find_by(name: params.setting)
context[:previous_value] = previous_record&.group_ids
context[:new_value] = ""
previous_record&.destroy!
end
def log_site_setting_groups_change(params:, guardian:, new_value:, previous_value:)
StaffActionLogger.new(guardian.user).log_site_setting_groups_change(
params.setting,
previous_value,
new_value,
)
end
def notify_changed
SiteSetting.refresh_site_setting_group_ids!
SiteSetting.notify_changed!
end
end