mirror of
https://github.com/discourse/discourse.git
synced 2024-12-11 16:33:41 +08:00
213 lines
4.8 KiB
Ruby
213 lines
4.8 KiB
Ruby
class PostSerializer < ApplicationSerializer
|
|
|
|
# To pass in additional information we might need
|
|
attr_accessor :topic_slug
|
|
attr_accessor :topic_view
|
|
attr_accessor :parent_post
|
|
attr_accessor :add_raw
|
|
attr_accessor :single_post_link_counts
|
|
attr_accessor :draft_sequence
|
|
|
|
attributes :id,
|
|
:post_number,
|
|
:post_type,
|
|
:created_at,
|
|
:updated_at,
|
|
:reply_count,
|
|
:reply_to_post_number,
|
|
:quote_count,
|
|
:avg_time,
|
|
:incoming_link_count,
|
|
:reads,
|
|
:score,
|
|
:yours,
|
|
:topic_slug,
|
|
:topic_id,
|
|
:display_username,
|
|
:version,
|
|
:can_edit,
|
|
:can_delete,
|
|
:can_recover,
|
|
:link_counts,
|
|
:cooked,
|
|
:read,
|
|
:username,
|
|
:name,
|
|
:reply_to_user,
|
|
:bookmarked,
|
|
:raw,
|
|
:actions_summary,
|
|
:new_user?,
|
|
:moderator?,
|
|
:avatar_template,
|
|
:user_id,
|
|
:draft_sequence,
|
|
:hidden,
|
|
:hidden_reason_id,
|
|
:deleted_at
|
|
|
|
|
|
def new_user?
|
|
# 21 calls = 5ms ... if there was a proper date in the RHS it would be 1ms
|
|
object.user.created_at > SiteSetting.new_user_period_days.days.ago
|
|
end
|
|
|
|
def moderator?
|
|
object.user.has_trust_level?(:moderator)
|
|
end
|
|
|
|
def avatar_template
|
|
object.user.avatar_template
|
|
end
|
|
|
|
def yours
|
|
scope.user == object.user
|
|
end
|
|
|
|
def can_edit
|
|
scope.can_edit?(object)
|
|
end
|
|
|
|
def can_delete
|
|
scope.can_delete?(object)
|
|
end
|
|
|
|
def can_recover
|
|
scope.can_recover_post?(object)
|
|
end
|
|
|
|
def link_counts
|
|
|
|
return @single_post_link_counts if @single_post_link_counts.present?
|
|
|
|
# TODO: This could be better, just porting the old one over
|
|
@topic_view.link_counts[object.id].map do |link|
|
|
result = {}
|
|
result[:url] = link[:url]
|
|
result[:internal] = link[:internal]
|
|
result[:reflection] = link[:reflection]
|
|
result[:title] = link[:title] if link[:title].present?
|
|
result[:clicks] = link[:clicks] || 0
|
|
result
|
|
end
|
|
end
|
|
|
|
def cooked
|
|
if object.hidden && !scope.is_admin?
|
|
if scope.current_user && object.user_id == scope.current_user.id
|
|
I18n.t('flagging.you_must_edit')
|
|
else
|
|
I18n.t('flagging.user_must_edit')
|
|
end
|
|
else
|
|
object.filter_quotes(@parent_post)
|
|
end
|
|
end
|
|
|
|
def read
|
|
@topic_view.read?(object.post_number)
|
|
end
|
|
|
|
def score
|
|
object.score || 0
|
|
end
|
|
|
|
def display_username
|
|
object.user.name
|
|
end
|
|
|
|
def version
|
|
object.cached_version
|
|
end
|
|
|
|
def username
|
|
object.user.username
|
|
end
|
|
|
|
def name
|
|
object.user.name
|
|
end
|
|
|
|
def reply_to_user
|
|
{
|
|
username: object.reply_to_user.username,
|
|
name: object.reply_to_user.name
|
|
}
|
|
end
|
|
|
|
def bookmarked
|
|
true
|
|
end
|
|
|
|
# Summary of the actions taken on this post
|
|
def actions_summary
|
|
result = []
|
|
PostActionType.types.each do |sym, id|
|
|
next if [:bookmark].include?(sym)
|
|
count_col = "#{sym}_count".to_sym
|
|
|
|
count = object.send(count_col) if object.respond_to?(count_col)
|
|
count ||= 0
|
|
action_summary = {id: id,
|
|
count: count,
|
|
hidden: (sym == :vote),
|
|
can_act: scope.post_can_act?(object, sym, taken_actions: post_actions)}
|
|
|
|
# The following only applies if you're logged in
|
|
if action_summary[:can_act] && scope.current_user.present?
|
|
action_summary[:can_clear_flags] = scope.is_admin? && PostActionType.flag_types.values.include?(id)
|
|
end
|
|
|
|
if post_actions.present? && post_actions.has_key?(id)
|
|
action_summary[:acted] = true
|
|
action_summary[:can_undo] = scope.can_delete?(post_actions[id])
|
|
end
|
|
|
|
# anonymize flags
|
|
if !scope.is_admin? && PostActionType.flag_types.values.include?(id)
|
|
action_summary[:count] = action_summary[:acted] ? 1 : 0
|
|
end
|
|
|
|
result << action_summary
|
|
end
|
|
|
|
result
|
|
end
|
|
|
|
def include_draft_sequence?
|
|
@draft_sequence.present?
|
|
end
|
|
|
|
def include_slug_title?
|
|
@topic_slug.present?
|
|
end
|
|
|
|
def include_raw?
|
|
@add_raw.present?
|
|
end
|
|
|
|
def include_link_counts?
|
|
return true if @single_post_link_counts.present?
|
|
|
|
@topic_view.present? && @topic_view.link_counts.present? && @topic_view.link_counts[object.id].present?
|
|
end
|
|
|
|
def include_read?
|
|
@topic_view.present?
|
|
end
|
|
|
|
def include_reply_to_user?
|
|
object.quoteless? && object.reply_to_user
|
|
end
|
|
|
|
def include_bookmarked?
|
|
post_actions.present? && post_actions.keys.include?(PostActionType.types[:bookmark])
|
|
end
|
|
|
|
private
|
|
|
|
def post_actions
|
|
@post_actions ||= (@topic_view.present? && @topic_view.all_post_actions.present?) ? @topic_view.all_post_actions[object.id] : nil
|
|
end
|
|
end
|