0
0
Fork 1
Spiegel von https://github.com/paviliondev/discourse-custom-wizard.git synchronisiert 2024-11-25 10:40:28 +01:00
discourse-custom-wizard/lib/custom_wizard/action.rb

841 Zeilen
20 KiB
Ruby

2021-03-11 07:30:15 +01:00
# frozen_string_literal: true
2020-03-30 08:16:03 +02:00
class CustomWizard::Action
attr_accessor :submission,
2020-03-30 08:16:03 +02:00
:action,
:user,
:guardian,
2020-04-14 16:10:26 +02:00
:result
2021-03-11 07:30:15 +01:00
2022-12-24 09:42:09 +01:00
REQUIRES_USER = %w[
create_topic
update_profile
open_composer
watch_categories
add_to_group
]
def initialize(opts)
@wizard = opts[:wizard]
@action = opts[:action]
@user = @wizard.user
@guardian = Guardian.new(@user)
@submission = opts[:submission]
2020-04-15 02:46:44 +02:00
@log = []
@result = CustomWizard::ActionResult.new
2020-03-30 08:16:03 +02:00
end
2021-03-11 07:30:15 +01:00
def perform
2022-12-24 09:42:09 +01:00
if REQUIRES_USER.include?(action['id']) && !@user
log_error("action requires user", "id: #{action['id']};")
@result.success = false
return @result
end
2020-04-14 16:10:26 +02:00
ActiveRecord::Base.transaction do
self.send(action['type'].to_sym)
2020-04-15 02:46:44 +02:00
end
2021-03-11 07:30:15 +01:00
if creates_post? && @result.success?
@result.handler.enqueue_jobs
2020-04-14 16:10:26 +02:00
end
2021-03-11 07:30:15 +01:00
if @result.success? && @result.output.present?
@submission.fields[action['id']] = @result.output
end
2021-03-11 07:30:15 +01:00
save_log
@result.submission = @submission
@result
2020-03-30 08:16:03 +02:00
end
2021-03-11 07:30:15 +01:00
def mapper_data
@mapper_data ||= @submission&.fields_and_meta || {}
end
2020-03-30 08:16:03 +02:00
def mapper
@mapper ||= CustomWizard::Mapper.new(user: user, data: mapper_data)
2020-03-30 08:16:03 +02:00
end
2021-03-11 07:30:15 +01:00
2022-09-23 16:52:55 +02:00
def callbacks_for(action)
self.class.callbacks[action] || []
end
2020-03-31 08:29:59 +02:00
def create_topic
2020-07-20 06:26:11 +02:00
params = basic_topic_params.merge(public_topic_params)
2021-03-11 07:30:15 +01:00
2022-09-23 16:52:55 +02:00
callbacks_for(:before_create_topic).each do |acb|
2022-09-19 12:09:34 +02:00
params = acb.call(params, @wizard, @action, @submission)
end
if params[:title].present? && params[:raw].present?
2020-03-30 08:16:03 +02:00
creator = PostCreator.new(user, params)
post = creator.create
2021-03-11 07:30:15 +01:00
2020-03-30 08:16:03 +02:00
if creator.errors.present?
2020-04-15 02:46:44 +02:00
messages = creator.errors.full_messages.join(" ")
log_error("failed to create", messages)
2020-04-02 07:21:57 +02:00
elsif action['skip_redirect'].blank?
@submission.redirect_on_complete = post.topic.url
2020-03-30 08:16:03 +02:00
end
2021-03-11 07:30:15 +01:00
2020-04-14 16:10:26 +02:00
if creator.errors.blank?
2020-04-15 03:06:50 +02:00
log_success("created topic", "id: #{post.topic.id}")
result.handler = creator
result.output = post.topic.id
2020-04-14 16:10:26 +02:00
end
else
2020-04-15 03:05:26 +02:00
log_error("invalid topic params", "title: #{params[:title]}; post: #{params[:raw]}")
2020-03-30 08:16:03 +02:00
end
end
2021-03-11 07:30:15 +01:00
2020-03-30 08:16:03 +02:00
def send_message
2020-10-20 07:40:23 +02:00
if action['required'].present?
required = CustomWizard::Mapper.new(
inputs: action['required'],
data: mapper_data,
2020-10-20 07:40:23 +02:00
user: user
).perform
2021-03-11 07:30:15 +01:00
2020-10-20 07:40:23 +02:00
if required.blank?
log_error("required input not present")
return
end
2020-04-15 03:05:26 +02:00
end
2021-03-11 07:30:15 +01:00
2020-04-02 07:21:57 +02:00
params = basic_topic_params
2021-03-11 07:30:15 +01:00
targets = CustomWizard::Mapper.new(
2020-04-02 07:21:57 +02:00
inputs: action['recipient'],
data: mapper_data,
user: user,
multiple: true
2020-04-06 10:36:38 +02:00
).perform
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
if targets.blank?
log_error("no recipients", "send_message has no recipients")
return
end
2021-03-11 07:30:15 +01:00
params[:target_group_names] = []
params[:target_usernames] = []
targets.each do |target|
if Group.find_by(name: target)
params[:target_group_names] << target
elsif User.find_by_username(target)
params[:target_usernames] << target
else
#
end
end
2021-03-11 07:30:15 +01:00
if params[:title].present? &&
params[:raw].present? &&
(params[:target_usernames].present? ||
params[:target_group_names].present?)
2021-03-11 07:30:15 +01:00
2020-04-02 07:21:57 +02:00
params[:archetype] = Archetype.private_message
2021-03-11 07:30:15 +01:00
poster = user || Discourse.system_user
2023-01-18 19:53:36 +01:00
creator = PostCreator.new(poster, params)
2020-03-30 08:16:03 +02:00
post = creator.create
if creator.errors.present?
2020-04-15 02:46:44 +02:00
messages = creator.errors.full_messages.join(" ")
log_error("failed to create message", messages)
2023-01-18 19:53:36 +01:00
elsif user && action['skip_redirect'].blank?
@submission.redirect_on_complete = post.topic.url
2020-03-30 08:16:03 +02:00
end
2021-03-11 07:30:15 +01:00
2020-04-14 16:10:26 +02:00
if creator.errors.blank?
2020-04-15 03:46:55 +02:00
log_success("created message", "id: #{post.topic.id}")
result.handler = creator
result.output = post.topic.id
2020-04-14 16:10:26 +02:00
end
else
2020-04-15 03:05:26 +02:00
log_error(
"invalid message params",
"title: #{params[:title]}; post: #{params[:raw]}; recipients: #{params[:target_usernames]}"
)
2020-03-30 08:16:03 +02:00
end
end
def update_profile
2020-04-07 15:33:11 +02:00
params = {}
2021-03-11 07:30:15 +01:00
if (profile_updates = action['profile_updates'])
profile_updates.first[:pairs].each do |pair|
if allowed_profile_field?(pair['key'])
key = cast_profile_key(pair['key'])
2020-10-20 01:15:03 +02:00
value = cast_profile_value(
mapper.map_field(
pair['value'],
pair['value_type']
),
pair['key']
)
2021-03-11 07:30:15 +01:00
if user_field?(pair['key'])
params[:custom_fields] ||= {}
params[:custom_fields][key] = value
else
params[key.to_sym] = value
end
end
2020-03-30 08:16:03 +02:00
end
end
2021-03-11 07:30:15 +01:00
2020-04-07 15:33:11 +02:00
params = add_custom_fields(params)
2021-03-11 07:30:15 +01:00
2020-04-07 15:33:11 +02:00
if params.present?
2020-04-14 16:10:26 +02:00
result = UserUpdater.new(Discourse.system_user, user).update(params)
2021-03-11 07:30:15 +01:00
2020-04-07 15:33:11 +02:00
if params[:avatar].present?
2020-04-14 16:10:26 +02:00
result = update_avatar(params[:avatar])
end
2021-03-11 07:30:15 +01:00
2020-04-14 16:10:26 +02:00
if result
2020-04-15 05:34:54 +02:00
log_success("updated profile fields", "fields: #{params.keys.map(&:to_s).join(',')}")
2020-04-14 16:10:26 +02:00
else
2020-04-15 03:42:24 +02:00
log_error("failed to update profile fields", "result: #{result.inspect}")
2020-04-07 15:33:11 +02:00
end
2020-04-14 16:10:26 +02:00
else
2020-04-15 03:42:24 +02:00
log_error("invalid profile fields params", "params: #{params.inspect}")
2020-03-30 08:16:03 +02:00
end
end
2022-12-23 17:28:09 +01:00
def watch_tags
tags = CustomWizard::Mapper.new(
inputs: action['tags'],
data: mapper_data,
user: user
).perform
tags = [*tags]
level = action['notification_level'].to_sym
if level.blank?
log_error("Notifcation Level was not set. Exiting watch tags action")
return
end
users = []
if action['usernames']
mapped_users = CustomWizard::Mapper.new(
inputs: action['usernames'],
data: mapper_data,
user: user
).perform
if mapped_users.present?
mapped_users = mapped_users.split(',')
.map { |username| User.find_by(username: username) }
users.push(*mapped_users)
end
end
if ActiveRecord::Type::Boolean.new.cast(action['wizard_user'])
users.push(user)
end
users.each do |user|
result = TagUser.batch_set(user, level, tags)
if result
log_success("#{user.username} notifications for #{tags} set to #{level}")
else
log_error("failed to set #{user.username} notifications for #{tags} to #{level}")
end
end
end
def watch_categories
2020-05-24 12:23:17 +02:00
watched_categories = CustomWizard::Mapper.new(
inputs: action['categories'],
data: mapper_data,
user: user
).perform
2021-03-11 07:30:15 +01:00
2020-07-20 05:51:11 +02:00
watched_categories = [*watched_categories].map(&:to_i)
notification_level = action['notification_level']
if notification_level.blank?
2020-07-20 05:06:36 +02:00
log_error("Notifcation Level was not set. Exiting wizard action")
return
end
mute_remainder = CustomWizard::Mapper.new(
inputs: action['mute_remainder'],
data: mapper_data,
user: user
).perform
2021-03-11 07:30:15 +01:00
2020-07-20 05:06:36 +02:00
users = []
2021-03-11 07:30:15 +01:00
2020-07-20 05:06:36 +02:00
if action['usernames']
mapped_users = CustomWizard::Mapper.new(
inputs: action['usernames'],
data: mapper_data,
2020-07-20 05:06:36 +02:00
user: user
).perform
2021-03-11 07:30:15 +01:00
2020-07-20 05:06:36 +02:00
if mapped_users.present?
mapped_users = mapped_users.split(',')
.map { |username| User.find_by(username: username) }
users.push(*mapped_users)
end
end
2021-03-11 07:30:15 +01:00
2020-07-20 05:06:36 +02:00
if ActiveRecord::Type::Boolean.new.cast(action['wizard_user'])
users.push(user)
end
2020-07-20 05:06:36 +02:00
category_ids = Category.all.pluck(:id)
set_level = CategoryUser.notification_levels[notification_level.to_sym]
mute_level = CategoryUser.notification_levels[:muted]
2021-03-11 07:30:15 +01:00
2020-07-20 05:06:36 +02:00
users.each do |user|
category_ids.each do |category_id|
new_level = nil
2021-03-11 07:30:15 +01:00
2020-07-20 05:06:36 +02:00
if watched_categories.include?(category_id) && set_level != nil
new_level = set_level
elsif mute_remainder
new_level = mute_level
end
2021-03-11 07:30:15 +01:00
2020-07-20 05:06:36 +02:00
if new_level
CategoryUser.set_notification_level_for_category(user, new_level, category_id)
end
end
2021-03-11 07:30:15 +01:00
2020-07-20 05:06:36 +02:00
if watched_categories.any?
log_success("#{user.username} notifications for #{watched_categories} set to #{set_level}")
end
2021-03-11 07:30:15 +01:00
2020-07-20 05:06:36 +02:00
if mute_remainder
log_success("#{user.username} notifications for all other categories muted")
end
end
end
2020-03-30 08:16:03 +02:00
def send_to_api
api_body = nil
if action['api_body'] != ""
begin
api_body_parsed = JSON.parse(action['api_body'])
rescue JSON::ParserError
raise Discourse::InvalidParameters, "Invalid API body definition: #{action['api_body']} for #{action['title']}"
end
api_body = JSON.parse(mapper.interpolate(JSON.generate(api_body_parsed)))
end
result = CustomWizard::Api::Endpoint.request(user, action['api'], action['api_endpoint'], api_body)
if error = result['error'] || (result[0] && result[0]['error'])
error = error['message'] || error
2020-04-15 05:34:54 +02:00
log_error("api request failed", "message: #{error}")
2020-03-30 08:16:03 +02:00
else
2020-04-15 05:34:54 +02:00
log_success("api request succeeded", "result: #{result}")
2020-03-30 08:16:03 +02:00
end
end
2021-03-11 07:30:15 +01:00
def open_composer
2020-04-15 05:52:02 +02:00
params = basic_topic_params
2021-03-11 07:30:15 +01:00
2020-04-15 05:52:02 +02:00
if params[:title].present? && params[:raw].present?
url = "/new-topic?title=#{encode_query_param(params[:title])}"
url += "&body=#{encode_query_param(params[:raw])}"
2021-03-11 07:30:15 +01:00
2020-04-15 05:52:02 +02:00
if category_id = action_category
url += "&category_id=#{category_id}"
2020-03-30 08:16:03 +02:00
end
2021-03-11 07:30:15 +01:00
2020-04-15 05:52:02 +02:00
if tags = action_tags
url += "&tags=#{tags.join(',')}"
end
2021-03-11 07:30:15 +01:00
route_to = Discourse.base_uri + url
@result.output = @submission.route_to = route_to
2021-03-11 07:30:15 +01:00
log_success("route: #{route_to}")
2020-04-15 05:52:02 +02:00
else
log_error("invalid composer params", "title: #{params[:title]}; post: #{params[:raw]}")
2021-03-11 07:30:15 +01:00
end
2020-03-30 08:16:03 +02:00
end
def add_to_group
2020-04-15 03:42:24 +02:00
group_map = CustomWizard::Mapper.new(
inputs: action['group'],
data: mapper_data,
2020-03-30 08:16:03 +02:00
user: user,
opts: {
multiple: true
}
2020-04-06 10:36:38 +02:00
).perform
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
group_map = group_map.flatten.compact
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
unless group_map.present?
log_error("invalid group map")
return
end
2021-03-11 07:30:15 +01:00
groups = group_map.reduce([]) do |result, g|
2020-03-30 08:16:03 +02:00
begin
result.push(Integer(g))
2020-03-30 08:16:03 +02:00
rescue ArgumentError
group = Group.find_by(name: g)
result.push(group.id) if group
2020-03-30 08:16:03 +02:00
end
2021-03-11 07:30:15 +01:00
result
2020-03-30 08:16:03 +02:00
end
2021-03-11 07:30:15 +01:00
2020-04-15 03:42:24 +02:00
result = nil
2021-03-11 07:30:15 +01:00
2020-03-30 08:16:03 +02:00
if groups.present?
groups.each do |group_id|
group = Group.find(group_id) if group_id
2020-04-14 16:10:26 +02:00
result = group.add(user) if group
2020-03-30 08:16:03 +02:00
end
end
2021-03-11 07:30:15 +01:00
2020-04-14 16:10:26 +02:00
if result
2020-04-15 03:42:24 +02:00
log_success("added to groups", "groups: #{groups.map(&:to_s).join(',')}")
2020-04-14 16:10:26 +02:00
else
2021-03-11 07:30:15 +01:00
detail = groups.present? ? "groups: #{groups.map(&:to_s).join(',')}" : nil
2020-04-15 03:42:24 +02:00
log_error("failed to add to groups", detail)
2020-04-14 16:10:26 +02:00
end
2020-03-30 08:16:03 +02:00
end
def route_to
2020-04-29 03:47:08 +02:00
return unless (url_input = action['url']).present?
2021-03-11 07:30:15 +01:00
2020-04-29 03:47:08 +02:00
if url_input.is_a?(String)
url = mapper.interpolate(url_input)
else
url = CustomWizard::Mapper.new(
inputs: url_input,
data: mapper_data,
2020-04-29 03:47:08 +02:00
user: user
).perform
end
2021-03-11 07:30:15 +01:00
2020-03-30 08:16:03 +02:00
if action['code']
@submission.fields[action['code']] = SecureRandom.hex(8)
url += "&#{action['code']}=#{@submission.fields[action['code']]}"
2020-03-30 08:16:03 +02:00
end
2021-03-11 07:30:15 +01:00
route_to = UrlHelper.encode(url)
@submission.route_to = route_to
2021-03-11 07:30:15 +01:00
2020-04-15 03:05:26 +02:00
log_info("route: #{route_to}")
2020-03-30 08:16:03 +02:00
end
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
def create_group
group =
begin
2020-10-20 01:15:03 +02:00
Group.new(new_group_params.except(:usernames, :owner_usernames))
rescue ArgumentError => e
raise Discourse::InvalidParameters, "Invalid group params"
end
2021-03-11 07:30:15 +01:00
2020-07-16 09:50:09 +02:00
if group.save
2020-10-20 01:15:03 +02:00
def get_user_ids(username_string)
User.where(username: username_string.split(",")).pluck(:id)
end
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
if new_group_params[:owner_usernames].present?
owner_ids = get_user_ids(new_group_params[:owner_usernames])
owner_ids.each { |user_id| group.group_users.build(user_id: user_id, owner: true) }
end
if new_group_params[:usernames].present?
user_ids = get_user_ids(new_group_params[:usernames])
if user_ids.count < new_group_params[:usernames].count
log_error("Warning, group creation: some users were not found!")
end
2020-10-20 01:15:03 +02:00
user_ids -= owner_ids if owner_ids
user_ids.each { |user_id| group.group_users.build(user_id: user_id) }
end
2021-03-11 07:30:15 +01:00
if group.save
log_success("Group created", group.name)
end
2021-03-11 07:30:15 +01:00
result.output = group.name
else
2020-10-20 01:15:03 +02:00
log_error("Group creation failed", group.errors.messages)
end
end
2021-03-11 07:30:15 +01:00
def create_category
category =
begin
Category.new(new_category_params.merge(user: user))
rescue ArgumentError => e
raise Discourse::InvalidParameters, "Invalid category params"
end
2021-03-11 07:30:15 +01:00
if category.save
StaffActionLogger.new(user).log_category_creation(category)
log_success("Category created", category.name)
result.output = category.id
else
2020-10-20 01:15:03 +02:00
log_error("Category creation failed", category.errors.messages)
end
end
2021-03-11 07:30:15 +01:00
2022-09-23 16:52:55 +02:00
def self.callbacks
@callbacks ||= {}
end
def self.register_callback(action, &block)
callbacks[action] ||= []
callbacks[action] << block
end
2020-04-02 07:21:57 +02:00
private
2021-03-11 07:30:15 +01:00
2020-04-02 07:21:57 +02:00
def action_category
output = CustomWizard::Mapper.new(
inputs: action['category'],
data: mapper_data,
2020-04-02 07:21:57 +02:00
user: user
2020-04-06 10:36:38 +02:00
).perform
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
return false unless output.present?
2021-03-11 07:30:15 +01:00
2020-04-02 07:21:57 +02:00
if output.is_a?(Array)
output.first
elsif output.is_a?(Integer)
output
elsif output.is_a?(String)
output.to_i
2020-03-30 08:16:03 +02:00
end
end
2021-03-11 07:30:15 +01:00
2020-03-30 08:16:03 +02:00
def action_tags
2020-04-02 07:21:57 +02:00
output = CustomWizard::Mapper.new(
inputs: action['tags'],
data: mapper_data,
2020-04-02 07:21:57 +02:00
user: user,
2020-04-06 10:36:38 +02:00
).perform
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
return false unless output.present?
2021-03-11 07:30:15 +01:00
2020-04-02 07:21:57 +02:00
if output.is_a?(Array)
output.flatten
2020-04-07 13:17:20 +02:00
else output.is_a?(String)
2020-04-02 07:21:57 +02:00
[*output]
end
end
2021-03-11 07:30:15 +01:00
2020-04-02 07:21:57 +02:00
def add_custom_fields(params = {})
if (custom_fields = action['custom_fields']).present?
2020-04-06 10:36:38 +02:00
field_map = CustomWizard::Mapper.new(
inputs: custom_fields,
data: mapper_data,
2020-04-06 10:36:38 +02:00
user: user
).perform
registered_fields = CustomWizard::CustomField.full_list
2021-03-11 07:30:15 +01:00
2020-04-06 10:36:38 +02:00
field_map.each do |field|
keyArr = field[:key].split('.')
value = field[:value]
2021-03-11 07:30:15 +01:00
2020-10-20 07:40:23 +02:00
if keyArr.length > 1
klass = keyArr.first.to_sym
name = keyArr.second
if keyArr.length === 3 && name.include?("{}")
name = name.gsub("{}", "")
json_attr = keyArr.last
type = :json
end
2020-10-20 07:40:23 +02:00
else
name = keyArr.first
end
2021-03-11 07:30:15 +01:00
registered = registered_fields.select { |f| f.name == name }.first
if registered.present?
klass = registered.klass.to_sym
type = registered.type.to_sym
2020-10-20 07:40:23 +02:00
end
2021-03-11 07:30:15 +01:00
next if type === :json && json_attr.blank?
if klass === :topic
2020-04-06 10:36:38 +02:00
params[:topic_opts] ||= {}
params[:topic_opts][:custom_fields] ||= {}
if type === :json
params[:topic_opts][:custom_fields][name] ||= {}
params[:topic_opts][:custom_fields][name][json_attr] = value
else
params[:topic_opts][:custom_fields][name] = value
end
2020-04-07 15:33:11 +02:00
else
if type === :json
params[:custom_fields][name] ||= {}
params[:custom_fields][name][json_attr] = value
else
params[:custom_fields] ||= {}
params[:custom_fields][name] = value
end
2020-04-02 07:21:57 +02:00
end
end
2020-03-30 08:16:03 +02:00
end
2021-03-11 07:30:15 +01:00
2020-04-02 07:21:57 +02:00
params
end
2021-03-11 07:30:15 +01:00
2020-04-02 07:21:57 +02:00
def basic_topic_params
params = {
2021-10-19 05:35:55 +02:00
skip_validations: true,
topic_opts: {
custom_fields: {
2021-10-30 12:37:16 +02:00
wizard_submission_id: @wizard.current_submission.id
2021-10-19 05:35:55 +02:00
}
}
2020-04-02 07:21:57 +02:00
}
2021-03-11 07:30:15 +01:00
2020-04-02 07:21:57 +02:00
params[:title] = CustomWizard::Mapper.new(
inputs: action['title'],
data: mapper_data,
2020-04-02 07:21:57 +02:00
user: user
2020-04-06 10:36:38 +02:00
).perform
2020-04-02 07:21:57 +02:00
2020-04-15 03:23:41 +02:00
params[:raw] = action['post_builder'] ?
mapper.interpolate(
action['post_template'],
user: true,
value: true,
wizard: true,
template: true
) :
@submission.fields[action['post']]
2021-03-11 07:30:15 +01:00
params[:import_mode] = ActiveRecord::Type::Boolean.new.cast(action['suppress_notifications'])
2021-03-11 07:30:15 +01:00
2020-04-07 15:33:11 +02:00
add_custom_fields(params)
2020-03-30 08:16:03 +02:00
end
2021-03-11 07:30:15 +01:00
2020-07-20 06:26:11 +02:00
def public_topic_params
params = {}
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
if category = action_category
2020-07-20 06:26:11 +02:00
params[:category] = category
end
2021-03-11 07:30:15 +01:00
2020-11-03 01:24:20 +01:00
if tags = action_tags
2020-07-20 06:26:11 +02:00
params[:tags] = tags
end
2021-03-11 07:30:15 +01:00
2020-07-20 06:26:11 +02:00
if public_topic_fields.any?
public_topic_fields.each do |field|
unless action[field].nil? || action[field] == ""
params[field.to_sym] = CustomWizard::Mapper.new(
inputs: action[field],
data: mapper_data,
2020-07-20 06:26:11 +02:00
user: user
).perform
end
end
end
2021-03-11 07:30:15 +01:00
2020-07-20 06:26:11 +02:00
params
end
2021-03-11 07:30:15 +01:00
def new_group_params
params = {}
2021-03-11 07:30:15 +01:00
%w(
name
full_name
title
2020-07-16 09:50:09 +02:00
bio_raw
owner_usernames
usernames
mentionable_level
messageable_level
visibility_level
members_visibility_level
grant_trust_level
).each do |attr|
2020-07-17 03:08:25 +02:00
input = action[attr]
2021-03-11 07:30:15 +01:00
2020-07-17 03:08:25 +02:00
if attr === "name" && input.blank?
raise ArgumentError.new
end
2021-03-11 07:30:15 +01:00
2020-07-17 03:08:25 +02:00
if attr === "full_name" && input.blank?
input = action["name"]
end
2021-03-11 07:30:15 +01:00
if input.present?
2020-07-16 09:50:09 +02:00
value = CustomWizard::Mapper.new(
2020-07-17 03:08:25 +02:00
inputs: input,
data: mapper_data,
user: user
).perform
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
if value
value = value.parameterize(separator: '_') if attr === "name"
value = value.to_i if attr.include?("_level")
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
params[attr.to_sym] = value
end
end
end
2021-03-11 07:30:15 +01:00
add_custom_fields(params)
end
2021-03-11 07:30:15 +01:00
def new_category_params
params = {}
2021-03-11 07:30:15 +01:00
%w(
name
slug
color
text_color
parent_category_id
permissions
).each do |attr|
2021-03-11 07:30:15 +01:00
if action[attr].present?
2020-07-16 09:50:09 +02:00
value = CustomWizard::Mapper.new(
inputs: action[attr],
data: mapper_data,
user: user
).perform
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
if value
if attr === "parent_category_id" && value.is_a?(Array)
value = value[0]
end
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
if attr === "permissions" && value.is_a?(Array)
permissions = value
value = {}
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
permissions.each do |p|
k = p[:key]
v = p[:value].to_i
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
if k.is_a?(Array)
group = Group.find_by(id: k[0])
k = group.name
else
k = k.parameterize(separator: '_')
end
2021-03-11 07:30:15 +01:00
value[k] = v
2020-07-16 09:50:09 +02:00
end
end
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
if attr === 'slug'
value = value.parameterize(separator: '-')
end
2021-03-11 07:30:15 +01:00
2020-10-20 01:15:03 +02:00
params[attr.to_sym] = value
2020-07-16 09:50:09 +02:00
end
end
end
2021-03-11 07:30:15 +01:00
add_custom_fields(params)
end
2021-03-11 07:30:15 +01:00
def creates_post?
[:create_topic, :send_message].include?(action['type'].to_sym)
end
2021-03-11 07:30:15 +01:00
2020-07-20 06:26:11 +02:00
def public_topic_fields
['visible']
end
2021-03-11 07:30:15 +01:00
2020-04-07 16:18:12 +02:00
def profile_url_fields
['profile_background', 'card_background']
end
2021-03-11 07:30:15 +01:00
2020-04-07 16:18:12 +02:00
def cast_profile_key(key)
if profile_url_fields.include?(key)
"#{key}_upload_url"
else
key
end
end
2021-03-11 07:30:15 +01:00
2020-04-07 16:18:12 +02:00
def cast_profile_value(value, key)
2020-10-20 01:15:03 +02:00
return value if value.nil?
2021-03-11 07:30:15 +01:00
2020-04-07 16:18:12 +02:00
if profile_url_fields.include?(key)
value['url']
elsif key === 'avatar'
value['id']
else
value
end
end
2021-03-11 07:30:15 +01:00
2020-04-10 10:51:01 +02:00
def profile_excluded_fields
['username', 'email', 'trust_level'].freeze
2020-04-10 10:51:01 +02:00
end
2021-03-11 07:30:15 +01:00
def allowed_profile_field?(field)
allowed_profile_fields.include?(field) || user_field?(field)
end
2021-03-11 07:30:15 +01:00
def user_field?(field)
field.to_s.include?(::User::USER_FIELD_PREFIX) &&
2021-03-11 07:30:15 +01:00
::UserField.exists?(field.split('_').last.to_i)
end
2021-03-11 07:30:15 +01:00
2020-04-07 16:18:12 +02:00
def allowed_profile_fields
2021-03-11 07:30:15 +01:00
CustomWizard::Mapper.user_fields.select { |f| profile_excluded_fields.exclude?(f) } +
profile_url_fields +
2020-04-07 16:18:12 +02:00
['avatar']
end
2021-03-11 07:30:15 +01:00
2020-04-07 16:18:12 +02:00
def update_avatar(upload_id)
user.create_user_avatar unless user.user_avatar
user.user_avatar.custom_upload_id = upload_id
user.uploaded_avatar_id = upload_id
user.save!
user.user_avatar.save!
end
2021-03-11 07:30:15 +01:00
def encode_query_param(param)
Addressable::URI.encode_component(param, Addressable::URI::CharacterClasses::UNRESERVED)
end
2021-03-11 07:30:15 +01:00
2020-04-15 02:46:44 +02:00
def log_success(message, detail = nil)
2020-04-15 03:42:24 +02:00
@log.push("success: #{message} - #{detail}")
@result.success = true
2020-04-15 02:46:44 +02:00
end
2021-03-11 07:30:15 +01:00
2020-04-15 02:46:44 +02:00
def log_error(message, detail = nil)
2020-04-15 03:42:24 +02:00
@log.push("error: #{message} - #{detail}")
@result.success = false
2020-04-15 02:46:44 +02:00
end
2021-03-11 07:30:15 +01:00
2020-04-15 03:27:19 +02:00
def log_info(message, detail = nil)
2020-04-15 03:42:24 +02:00
@log.push("info: #{message} - #{detail}")
2020-04-15 03:05:26 +02:00
end
2021-03-11 07:30:15 +01:00
def save_log
2023-01-18 19:53:36 +01:00
username = user ? user.username : @wizard.actor_id
2021-08-10 15:18:02 +02:00
CustomWizard::Log.create(
@wizard.id,
action['type'],
2023-01-18 19:53:36 +01:00
username,
2021-08-10 15:18:02 +02:00
@log.join('; ')
)
end
2021-03-11 07:30:15 +01:00
end