FEATURE: support silent internal links (#25472)

Internal links always notify and add internal connections in topics.

This adds a special feature that lets you append `?silent=true` to a link
to have it excluded from:

1. Notifications - users will not be notified for these links
2. Post links below posts in the UI

This is specifically useful for large reports where adding all these connections
just results in noise.
This commit is contained in:
Sam 2024-01-30 17:03:58 +11:00 committed by GitHub
parent 304a7f3e1a
commit 27301ae5c7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 16 additions and 0 deletions

View File

@ -289,6 +289,10 @@ class TopicLink < ActiveRecord::Base
# Store the same URL that will be used in the cooked version of the post # Store the same URL that will be used in the cooked version of the post
url = UrlHelper.cook_url(upload.url, secure: upload.secure?) url = UrlHelper.cook_url(upload.url, secure: upload.secure?)
elsif route = Discourse.route_for(parsed) elsif route = Discourse.route_for(parsed)
# this is a special case for the silent flag
# in internal links
return nil if url && (url.split("?")[1] == "silent=true")
internal = true internal = true
# We aren't interested in tracking internal links to users # We aren't interested in tracking internal links to users

View File

@ -69,6 +69,18 @@ RSpec.describe TopicLink do
end end
describe "internal links" do describe "internal links" do
it "can exclude links with ?silent=true" do
url = topic.url
raw = "[silent link](#{url}?silent=true)"
post = Fabricate(:post, user: user, raw: raw)
TopicLink.extract_from(post)
expect(topic.topic_links.count).to eq(0)
expect(post.topic.topic_links.count).to eq(0)
end
it "extracts onebox" do it "extracts onebox" do
other_topic = Fabricate(:topic, user: user) other_topic = Fabricate(:topic, user: user)
Fabricate(:post, topic: other_topic, user: user, raw: "some content for the first post") Fabricate(:post, topic: other_topic, user: user, raw: "some content for the first post")