mirror of
https://github.com/discourse/discourse.git
synced 2025-02-28 00:24:09 +08:00
151 lines
3.7 KiB
Ruby
151 lines
3.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class TopicListItemSerializer < ListableTopicSerializer
|
|
include TopicTagsMixin
|
|
|
|
attributes :views,
|
|
:like_count,
|
|
:has_summary,
|
|
:archetype,
|
|
:last_poster_username,
|
|
:category_id,
|
|
:op_like_count,
|
|
:op_can_like,
|
|
:op_liked,
|
|
:first_post_id,
|
|
:pinned_globally,
|
|
:liked_post_numbers,
|
|
:featured_link,
|
|
:featured_link_root_domain,
|
|
:allowed_user_count,
|
|
:participant_groups
|
|
|
|
has_many :posters, serializer: TopicPosterSerializer, embed: :objects
|
|
has_many :participants, serializer: TopicPosterSerializer, embed: :objects
|
|
|
|
def include_participant_groups?
|
|
object.private_message?
|
|
end
|
|
|
|
def posters
|
|
object.posters || object.posters_summary || []
|
|
end
|
|
|
|
def op_like_count
|
|
object.first_post && object.first_post.like_count
|
|
end
|
|
|
|
def include_op_can_like?
|
|
theme_modifier_helper.serialize_topic_op_likes_data
|
|
end
|
|
|
|
def op_can_like
|
|
return false if !scope.user || !object.first_post
|
|
|
|
first_post = object.first_post
|
|
return false if first_post.user_id == scope.user.id
|
|
return false unless scope.post_can_act?(first_post, :like)
|
|
|
|
first_post_liked =
|
|
PostAction.where(
|
|
user_id: scope.user.id,
|
|
post_id: first_post.id,
|
|
post_action_type_id: PostActionType.types[:like],
|
|
).first
|
|
return scope.can_delete?(first_post_liked) if first_post_liked
|
|
|
|
true
|
|
end
|
|
|
|
def include_op_liked?
|
|
theme_modifier_helper.serialize_topic_op_likes_data
|
|
end
|
|
|
|
def op_liked
|
|
return false if !scope.user || !object.first_post
|
|
|
|
PostAction.where(
|
|
user_id: scope.user.id,
|
|
post_id: object.first_post.id,
|
|
post_action_type_id: PostActionType.types[:like],
|
|
).exists?
|
|
end
|
|
|
|
def include_first_post_id?
|
|
theme_modifier_helper.serialize_topic_op_likes_data
|
|
end
|
|
|
|
def first_post_id
|
|
return false if !object.first_post
|
|
object.first_post.id
|
|
end
|
|
|
|
def last_poster_username
|
|
posters.find { |poster| poster.user.id == object.last_post_user_id }.try(:user).try(:username)
|
|
end
|
|
|
|
def category_id
|
|
# If it's a shared draft, show the destination topic instead
|
|
if object.includes_destination_category && object.shared_draft
|
|
return object.shared_draft.category_id
|
|
end
|
|
|
|
object.category_id
|
|
end
|
|
|
|
def participants
|
|
object.participants_summary || []
|
|
end
|
|
|
|
def participant_groups
|
|
object.participant_groups_summary || []
|
|
end
|
|
|
|
def include_liked_post_numbers?
|
|
include_post_action? :like
|
|
end
|
|
|
|
def include_post_action?(action)
|
|
object.user_data && object.user_data.post_action_data &&
|
|
object.user_data.post_action_data.key?(PostActionType.types[action])
|
|
end
|
|
|
|
def liked_post_numbers
|
|
object.user_data.post_action_data[PostActionType.types[:like]]
|
|
end
|
|
|
|
def include_participants?
|
|
object.private_message?
|
|
end
|
|
|
|
def include_op_like_count?
|
|
# PERF: long term we probably want a cheaper way of looking stuff up
|
|
# this is rather odd code, but we need to have op_likes loaded somehow
|
|
# simplest optimisation is adding a cache column on topic.
|
|
object.association(:first_post).loaded?
|
|
end
|
|
|
|
def include_featured_link?
|
|
SiteSetting.topic_featured_link_enabled
|
|
end
|
|
|
|
def include_featured_link_root_domain?
|
|
SiteSetting.topic_featured_link_enabled && object.featured_link.present?
|
|
end
|
|
|
|
def allowed_user_count
|
|
# Don't use count as it will result in a query
|
|
object.allowed_users.length
|
|
end
|
|
|
|
def include_allowed_user_count?
|
|
object.private_message?
|
|
end
|
|
|
|
private
|
|
|
|
def theme_modifier_helper
|
|
@theme_modifier_helper ||= ThemeModifierHelper.new(request: scope.request)
|
|
end
|
|
end
|