discourse/app/serializers/topic_link_serializer.rb
Alan Guo Xiang Tan 63ca5673df
FIX: Filter orphaned TopicLinks and normalize http URLs to https (#37098)
What is the problem?

`TopicLink` records can reference deleted topics or posts. When a topic
or the target post being linked to is deleted, these orphaned links
continue to appear in topic maps and post link counts.

Note that `TopicLink` records are already deleted when the source post
containing the link is trashed (see `Post#trash!`), so we only need to
filter for deleted target topics/posts.

Additionally, internal links stored with http:// are not normalized to
https:// when `force_https` site setting is enabled.

---

What is the solution?

Extend filtering in `TopicLink.topic_map` and `TopicLink.counts_for` to
exclude links where the target topic or target post is deleted. Extract
common visibility filters into `TopicLink.apply_link_visibility_filters`
helper method.

Normalize internal http:// URLs to https:// in `TopicLinkSerializer#url`
when `force_https` is enabled.
2026-01-15 12:12:34 +08:00

34 lines
693 B
Ruby

# frozen_string_literal: true
class TopicLinkSerializer < ApplicationSerializer
attributes :url,
:title,
# :fancy_title,
:internal,
:attachment,
:reflection,
:clicks,
:user_id,
:domain,
:root_domain
def url
if object.internal && SiteSetting.force_https && object.url.start_with?("http://")
object.url.sub("http://", "https://")
else
object.url
end
end
def attachment
Discourse.store.has_been_uploaded?(object.url)
end
def include_user_id?
object.user_id.present?
end
def root_domain
MiniSuffix.domain(domain)
end
end