discourse/app/models/user_summary.rb

104 lines
2.3 KiB
Ruby
Raw Normal View History

# ViewModel used on Summary tab on User page
class UserSummary
MAX_SUMMARY_RESULTS = 6
2016-03-30 12:05:16 -04:00
MAX_BADGES = 6
alias :read_attribute_for_serialization :send
def initialize(user, guardian)
@user = user
@guardian = guardian
end
def topics
Topic
.secured(@guardian)
.listable_topics
.visible
.where(user: @user)
2016-03-30 12:05:16 -04:00
.order('like_count DESC, created_at ASC')
.includes(:user, :category)
.limit(MAX_SUMMARY_RESULTS)
end
def replies
Post
.secured(@guardian)
2016-03-30 12:05:16 -04:00
.includes(:user, topic: :category)
.references(:topic)
.merge(Topic.listable_topics.visible.secured(@guardian))
.where(user: @user)
.where('post_number > 1')
.where('topics.archetype <> ?', Archetype.private_message)
2016-03-30 12:05:16 -04:00
.order('posts.like_count DESC, posts.created_at ASC')
.limit(MAX_SUMMARY_RESULTS)
end
def links
TopicLink
.where(user: @user)
.where(internal: false)
.where(reflection: false)
.order('clicks DESC, created_at ASC')
.limit(MAX_SUMMARY_RESULTS)
end
class LikedByUser < OpenStruct
include ActiveModel::SerializerSupport
end
def most_liked_by_users
likers_ids = []
counts = []
UserAction.where(user: @user)
.where(action_type: UserAction::WAS_LIKED)
.group(:acting_user_id)
.order("COUNT(*) DESC")
.limit(MAX_SUMMARY_RESULTS)
.pluck("acting_user_id, COUNT(*)")
.each do |i|
likers_ids << i[0]
counts << i[1]
end
User.where(id: likers_ids)
.pluck(:id, :username, :name, :uploaded_avatar_id)
.map.with_index do |u, i|
LikedByUser.new(
id: u[0],
username: u[1],
name: u[2],
avatar_template: User.avatar_template(u[1], u[3]),
likes: counts[i]
)
end
end
def badges
2016-03-30 12:05:16 -04:00
@user.featured_user_badges(MAX_BADGES)
end
def user_stat
@user.user_stat
end
def bookmark_count
UserAction
.where(user: @user)
.where(action_type: UserAction::BOOKMARK)
.count
end
2016-03-30 12:05:16 -04:00
delegate :likes_given,
:likes_received,
:days_visited,
:posts_read_count,
:topic_count,
:post_count,
:time_read,
to: :user_stat
end