mirror of
https://github.com/discourse/discourse.git
synced 2024-11-24 01:22:36 +08:00
243 lines
5.3 KiB
Ruby
243 lines
5.3 KiB
Ruby
require_dependency 'pinned_check'
|
|
|
|
class TopicViewSerializer < ApplicationSerializer
|
|
|
|
# These attributes will be delegated to the topic
|
|
def self.topic_attributes
|
|
[:id,
|
|
:title,
|
|
:fancy_title,
|
|
:posts_count,
|
|
:created_at,
|
|
:views,
|
|
:reply_count,
|
|
:last_posted_at,
|
|
:visible,
|
|
:closed,
|
|
:archived,
|
|
:moderator_posts_count,
|
|
:has_best_of,
|
|
:archetype,
|
|
:slug,
|
|
:auto_close_at]
|
|
end
|
|
|
|
def self.guardian_attributes
|
|
[:can_moderate, :can_edit, :can_delete, :can_invite_to, :can_move_posts]
|
|
end
|
|
|
|
attributes *topic_attributes
|
|
attributes *guardian_attributes
|
|
|
|
attributes :draft,
|
|
:draft_key,
|
|
:draft_sequence,
|
|
:post_action_visibility,
|
|
:voted_in_topic,
|
|
:can_create_post,
|
|
:can_reply_as_new_topic,
|
|
:categoryName,
|
|
:starred,
|
|
:last_read_post_number,
|
|
:posted,
|
|
:notification_level,
|
|
:notifications_reason_id,
|
|
:posts,
|
|
:at_bottom,
|
|
:highest_post_number,
|
|
:pinned,
|
|
:filtered_posts_count
|
|
|
|
has_one :created_by, serializer: BasicUserSerializer, embed: :objects
|
|
has_one :last_poster, serializer: BasicUserSerializer, embed: :objects
|
|
has_many :allowed_users, serializer: BasicUserSerializer, embed: :objects
|
|
has_many :allowed_groups, serializer: BasicGroupSerializer, embed: :objects
|
|
|
|
has_many :links, serializer: TopicLinkSerializer, embed: :objects
|
|
has_many :participants, serializer: TopicPostCountSerializer, embed: :objects
|
|
has_many :suggested_topics, serializer: SuggestedTopicSerializer, embed: :objects
|
|
|
|
# Define a delegator for each attribute of the topic we want
|
|
topic_attributes.each do |ta|
|
|
class_eval %{def #{ta}
|
|
object.topic.#{ta}
|
|
end}
|
|
end
|
|
|
|
# Define the guardian attributes
|
|
guardian_attributes.each do |ga|
|
|
class_eval %{
|
|
def #{ga}
|
|
true
|
|
end
|
|
|
|
def include_#{ga}?
|
|
scope.#{ga}?(object.topic)
|
|
end
|
|
}
|
|
end
|
|
|
|
def draft
|
|
object.draft
|
|
end
|
|
|
|
def include_allowed_users?
|
|
object.topic.private_message?
|
|
end
|
|
|
|
def draft_key
|
|
object.draft_key
|
|
end
|
|
|
|
def draft_sequence
|
|
object.draft_sequence
|
|
end
|
|
|
|
def post_action_visibility
|
|
object.post_action_visibility
|
|
end
|
|
|
|
def include_post_action_visibility?
|
|
object.post_action_visibility.present?
|
|
end
|
|
|
|
def filtered_posts_count
|
|
object.filtered_posts_count
|
|
end
|
|
|
|
def voted_in_topic
|
|
object.voted_in_topic?
|
|
end
|
|
|
|
def can_reply_as_new_topic
|
|
true
|
|
end
|
|
|
|
def include_can_reply_as_new_topic?
|
|
scope.can_reply_as_new_topic?(object.topic)
|
|
end
|
|
|
|
def can_create_post
|
|
true
|
|
end
|
|
|
|
def include_can_create_post?
|
|
scope.can_create?(Post, object.topic)
|
|
end
|
|
|
|
def categoryName
|
|
object.topic.category.name
|
|
end
|
|
|
|
def include_categoryName?
|
|
object.topic.category.present?
|
|
end
|
|
|
|
# Topic user stuff
|
|
def has_topic_user?
|
|
object.topic_user.present?
|
|
end
|
|
|
|
def starred
|
|
object.topic_user.starred?
|
|
end
|
|
alias_method :include_starred?, :has_topic_user?
|
|
|
|
def last_read_post_number
|
|
object.topic_user.last_read_post_number
|
|
end
|
|
alias_method :include_last_read_post_number?, :has_topic_user?
|
|
|
|
def posted
|
|
object.topic_user.posted?
|
|
end
|
|
alias_method :include_posted?, :has_topic_user?
|
|
|
|
def notification_level
|
|
object.topic_user.notification_level
|
|
end
|
|
alias_method :include_notification_level?, :has_topic_user?
|
|
|
|
def notifications_reason_id
|
|
object.topic_user.notifications_reason_id
|
|
end
|
|
alias_method :include_notifications_reason_id?, :has_topic_user?
|
|
|
|
def created_by
|
|
object.topic.user
|
|
end
|
|
|
|
def last_poster
|
|
object.topic.last_poster
|
|
end
|
|
|
|
def allowed_users
|
|
object.topic.allowed_users
|
|
end
|
|
|
|
def allowed_groups
|
|
object.topic.allowed_groups
|
|
end
|
|
|
|
def include_links?
|
|
object.links.present?
|
|
end
|
|
|
|
def participants
|
|
object.post_counts_by_user.collect {|tuple| {user: object.participants[tuple.first], post_count: tuple[1]}}
|
|
end
|
|
|
|
def include_participants?
|
|
object.initial_load? && object.post_counts_by_user.present?
|
|
end
|
|
|
|
def suggested_topics
|
|
object.suggested_topics.topics
|
|
end
|
|
def include_suggested_topics?
|
|
at_bottom && object.suggested_topics.present?
|
|
end
|
|
|
|
# Whether we're at the bottom of a topic (last page)
|
|
def at_bottom
|
|
posts.present? && (@highest_number_in_posts == object.highest_post_number)
|
|
end
|
|
|
|
def highest_post_number
|
|
object.highest_post_number
|
|
end
|
|
|
|
def pinned
|
|
PinnedCheck.new(object.topic, object.topic_user).pinned?
|
|
end
|
|
|
|
def posts
|
|
return @posts if @posts.present?
|
|
@posts = []
|
|
@highest_number_in_posts = 0
|
|
if object.posts.present?
|
|
object.posts.each_with_index do |p, idx|
|
|
if p.user
|
|
@highest_number_in_posts = p.post_number if p.post_number > @highest_number_in_posts
|
|
ps = PostSerializer.new(p, scope: scope, root: false)
|
|
ps.topic_slug = object.topic.slug
|
|
ps.topic_view = object
|
|
p.topic = object.topic
|
|
|
|
post_json = ps.as_json
|
|
|
|
if object.index_reverse
|
|
post_json[:index] = object.index_offset - idx
|
|
else
|
|
post_json[:index] = object.index_offset + idx + 1
|
|
end
|
|
|
|
@posts << post_json
|
|
end
|
|
end
|
|
end
|
|
@posts
|
|
end
|
|
|
|
end
|