# frozen_string_literal: true DiscourseAutomation::Scriptable.add(DiscourseAutomation::Scripts::TOPIC) do version 1 field :creator, component: :user field :creator, component: :user, triggerable: :user_updated, accepted_contexts: [:updated_user] field :body, component: :post, required: true, accepts_placeholders: true field :title, component: :text, required: true, accepts_placeholders: true field :category, component: :category, required: true field :tags, component: :tags placeholder :creator_username placeholder :updated_user_username, triggerable: :user_updated placeholder :updated_user_name, triggerable: :user_updated triggerables %i[recurring point_in_time user_updated] script do |context, fields, automation| creator_username = fields.dig("creator", "value") creator_username = context["user"]&.username if creator_username == "updated_user" creator_username ||= Discourse.system_user.username placeholders = { creator_username: creator_username }.merge(context["placeholders"] || {}) if context["kind"] == DiscourseAutomation::Triggers::USER_UPDATED user = context["user"] user_data = context["user_data"] user_profile_data = user_data[:profile_data] || {} user_custom_fields = {} user_data[:custom_fields]&.each do |k, v| user_custom_fields[k.gsub(/\s+/, "_").underscore] = v end user = User.find(context["user"].id) placeholders["username"] = user.username placeholders["name"] = user.name placeholders["updated_user_username"] = user.username placeholders["updated_user_name"] = user.name placeholders = placeholders.merge(user_profile_data, user_custom_fields) end topic_raw = fields.dig("body", "value") topic_raw = utils.apply_placeholders(topic_raw, placeholders) title = fields.dig("title", "value") title = utils.apply_placeholders(title, placeholders) creator = User.find_by(username: creator_username) if !creator Rails.logger.warn "[discourse-automation] creator with username: `#{creator_username}` was not found" next end category_id = fields.dig("category", "value") category = Category.find_by(id: category_id) if !category Rails.logger.warn "[discourse-automation] category of id: `#{category_id}` was not found" next end tags = fields.dig("tags", "value") || [] begin new_post = PostCreator.new( creator, raw: topic_raw, title: title, category: category.id, tags: tags, ).create! rescue StandardError => e Rails.logger.warn "[discourse-automation] couldn't create post: #{e.message}" next end if context["kind"] == DiscourseAutomation::Triggers::USER_UPDATED && new_post.persisted? user.user_custom_fields.create(name: automation.name, value: "true") end end end