mirror of
https://github.com/discourse/discourse.git
synced 2026-08-11 02:59:07 +08:00
Backport of #42321 to release/2026.1.
Manual backport to also include the fix from PR #39873 (commit
05e03eab29) which was never backported to 2026.1
---
## Summary
Topic bookmark creation, listing, search, and reminder eligibility now
require the first post to be visible to the user. The fix adds an inner
join on the first post with hidden-post filtering to the list query and
delegates creation and visibility checks to `guardian.can_see_post?` on
the first post, preventing an authenticated user from bookmarking a
topic or searching its metadata after the first post is hidden.
## Source
- Patch Triage: https://patch.discourse.org/patch-triage/1530
Co-authored-by: discourse-patch-triage
<272280883+discourse-patch-triage[bot]@users.noreply.github.com>
---------
Co-authored-by: Sam <sam.saffron@gmail.com>
Co-authored-by: discourse-patch-triage[bot] <272280883+discourse-patch-triage[bot]@users.noreply.github.com>
Co-authored-by: Gabriel Grubba <70247653+Grubba27@users.noreply.github.com>
64 lines
1.3 KiB
Ruby
Vendored
64 lines
1.3 KiB
Ruby
Vendored
# frozen_string_literal: true
|
|
|
|
class UserTopicBookmarkSerializer < UserPostTopicBookmarkBaseSerializer
|
|
attributes :last_read_post_number
|
|
|
|
# NOTE: It does not matter what the linked post number is for topic bookmarks,
|
|
# on the client we always take the user to the last unread post in the
|
|
# topic when the bookmark URL is clicked
|
|
def linked_post_number
|
|
1
|
|
end
|
|
|
|
def first_post
|
|
@first_post ||= topic.first_post
|
|
end
|
|
|
|
def deleted
|
|
topic.deleted_at.present? || first_post.deleted_at.present?
|
|
end
|
|
|
|
def hidden
|
|
first_post.hidden
|
|
end
|
|
|
|
def raw
|
|
first_post.raw
|
|
end
|
|
|
|
def cooked
|
|
first_post.cooked
|
|
end
|
|
|
|
def post_item_excerpt_post
|
|
first_post
|
|
end
|
|
|
|
def bookmarkable_user
|
|
@bookmarkable_user ||= first_post.user
|
|
end
|
|
|
|
# NOTE: In the UI there are special topic-status and topic-link components to
|
|
# display the topic URL, this is only used for certain routes like the .ics bookmarks.
|
|
def bookmarkable_url
|
|
if @options[:link_to_first_unread_post]
|
|
Topic.url(topic_id, slug, (last_read_post_number || 0) + 1)
|
|
else
|
|
topic.url
|
|
end
|
|
end
|
|
|
|
def last_read_post_number
|
|
topic_user&.last_read_post_number
|
|
end
|
|
|
|
private
|
|
|
|
def topic
|
|
object.bookmarkable
|
|
end
|
|
|
|
def topic_user
|
|
topic.user_data
|
|
end
|
|
end
|