mirror of
https://github.com/discourse/discourse.git
synced 2024-11-27 17:33:37 +08:00
30990006a9
This reduces chances of errors where consumers of strings mutate inputs and reduces memory usage of the app. Test suite passes now, but there may be some stuff left, so we will run a few sites on a branch prior to merging
88 lines
2.1 KiB
Ruby
88 lines
2.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# This is used in topic lists
|
|
require_dependency 'topic_poster'
|
|
|
|
class TopicPostersSummary
|
|
attr_reader :topic, :options
|
|
|
|
def initialize(topic, options = {})
|
|
@topic = topic
|
|
@options = options
|
|
end
|
|
|
|
def summary
|
|
sorted_top_posters.compact.map(&method(:new_topic_poster_for))
|
|
end
|
|
|
|
private
|
|
|
|
def new_topic_poster_for(user)
|
|
TopicPoster.new.tap do |topic_poster|
|
|
topic_poster.user = user
|
|
topic_poster.description = descriptions_for(user)
|
|
topic_poster.primary_group = primary_group_lookup[user.id]
|
|
if topic.last_post_user_id == user.id
|
|
topic_poster.extras = +'latest'
|
|
topic_poster.extras << ' single' if user_ids.uniq.size == 1
|
|
end
|
|
end
|
|
end
|
|
|
|
def descriptions_by_id
|
|
@descriptions_by_id ||= begin
|
|
user_ids_with_descriptions.each_with_object({}) do |(id, description), descriptions|
|
|
descriptions[id] ||= []
|
|
descriptions[id] << description
|
|
end
|
|
end
|
|
end
|
|
|
|
def descriptions_for(user)
|
|
descriptions_by_id[user.id].join ', '
|
|
end
|
|
|
|
def shuffle_last_poster_to_back_in(summary)
|
|
unless last_poster_is_topic_creator?
|
|
summary.reject! { |u| u.id == topic.last_post_user_id }
|
|
summary << avatar_lookup[topic.last_post_user_id]
|
|
end
|
|
summary
|
|
end
|
|
|
|
def user_ids_with_descriptions
|
|
user_ids.zip([
|
|
:original_poster,
|
|
:most_recent_poster,
|
|
:frequent_poster,
|
|
:frequent_poster,
|
|
:frequent_poster,
|
|
:frequent_poster
|
|
].map { |description| I18n.t(description) })
|
|
end
|
|
|
|
def last_poster_is_topic_creator?
|
|
topic.user_id == topic.last_post_user_id
|
|
end
|
|
|
|
def sorted_top_posters
|
|
shuffle_last_poster_to_back_in top_posters
|
|
end
|
|
|
|
def top_posters
|
|
user_ids.map { |id| avatar_lookup[id] }.compact.uniq.take(5)
|
|
end
|
|
|
|
def user_ids
|
|
[ topic.user_id, topic.last_post_user_id, *topic.featured_user_ids ]
|
|
end
|
|
|
|
def avatar_lookup
|
|
@avatar_lookup ||= options[:avatar_lookup] || AvatarLookup.new(user_ids)
|
|
end
|
|
|
|
def primary_group_lookup
|
|
@primary_group_lookup ||= options[:primary_group_lookup] || PrimaryGroupLookup.new(user_ids)
|
|
end
|
|
end
|