From 175d2451a9606deb6a3f03be7761f1e1032c7e0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Saquetim?= <1108771+megothss@users.noreply.github.com> Date: Fri, 5 Apr 2024 12:37:53 -0300 Subject: [PATCH] DEV: Add `topic_embed_import_create_args` plugin modifier (#26527) * DEV: Add `topic_embed_import_create_args` plugin modifier This modifier allows a plugin to change the arguments used when creating a new topic for an imported article. For example: let's say you want to prepend "Imported: " to the title of every imported topic. You could use this modifier like so: ```ruby # In your plugin's code plugin.register_modifier(:topic_embed_import_create_args) do |args| args[:title] = "Imported: #{args[:title]}" args end ``` In this example, the modifier is prepending "Imported: " to the `title` in the `create_args` hash. This modified title would then be used when the new topic is created. --- app/models/topic_embed.rb | 11 +++++++++ spec/models/topic_embed_spec.rb | 44 +++++++++++++++++++++++++++++++-- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/app/models/topic_embed.rb b/app/models/topic_embed.rb index 89ef3a4c402..17aaab835fa 100644 --- a/app/models/topic_embed.rb +++ b/app/models/topic_embed.rb @@ -81,6 +81,17 @@ class TopicEmbed < ActiveRecord::Base } create_args[:visible] = false if SiteSetting.import_embed_unlisted? + # always return `args` when using this modifier, e.g: + # + # plugin.register_modifier(:topic_embed_import_create_args) do |args| + # args[:title] = "MODIFIED: #{args[:title]}" + # + # args # returning args is important to prevent errors + # end + create_args = + DiscoursePluginRegistry.apply_modifier(:topic_embed_import_create_args, create_args) || + create_args + post = PostCreator.create(user, create_args) post.topic.topic_embed.update!(embed_content_cache: original_contents) end diff --git a/spec/models/topic_embed_spec.rb b/spec/models/topic_embed_spec.rb index f571a7c0f31..d3e7608c702 100644 --- a/spec/models/topic_embed_spec.rb +++ b/spec/models/topic_embed_spec.rb @@ -245,6 +245,46 @@ RSpec.describe TopicEmbed do ) expect(imported_post.cooked).to match(/onebox|iframe/) end + + describe "topic_embed_import_create_args modifier" do + after { DiscoursePluginRegistry.clear_modifiers! } + + it "can alter the args used to create the topic" do + plugin = Plugin::Instance.new + plugin.register_modifier(:topic_embed_import_create_args) do |args| + args[:title] = "MODIFIED: #{args[:title]}" + + args + end + + Jobs.run_immediately! + imported_post = + TopicEmbed.import( + user, + "http://eviltrout.com/abcd", + title, + "some random content", + category_id: category.id, + ) + expect(imported_post.topic.title).to eq("MODIFIED: #{title}") + end + + it "will revert to defaults if the modifier returns nil" do + plugin = Plugin::Instance.new + plugin.register_modifier(:topic_embed_import_create_args) { |args| nil } + + Jobs.run_immediately! + imported_post = + TopicEmbed.import( + user, + "http://eviltrout.com/abcd", + title, + "some random content", + category_id: category.id, + ) + expect(imported_post.topic.title).to eq(title) + end + end end context "when post creation supports markdown rendering" do @@ -554,8 +594,8 @@ RSpec.describe TopicEmbed do url = "https://somesource.com" contents = <<~HTML - hello world new post hello - some image + hello world new post hello + some image HTML raw = TopicEmbed.absolutize_urls(url, contents)