2016-01-19 23:11:52 -05:00
|
|
|
# ViewModel used on Summary tab on User page
|
|
|
|
|
|
|
|
class UserSummary
|
|
|
|
|
2016-04-13 17:02:51 -04:00
|
|
|
MAX_SUMMARY_RESULTS = 6
|
2016-03-30 12:05:16 -04:00
|
|
|
MAX_BADGES = 6
|
2016-01-19 23:11:52 -05:00
|
|
|
|
|
|
|
alias :read_attribute_for_serialization :send
|
|
|
|
|
|
|
|
def initialize(user, guardian)
|
|
|
|
@user = user
|
|
|
|
@guardian = guardian
|
|
|
|
end
|
|
|
|
|
|
|
|
def topics
|
|
|
|
Topic
|
|
|
|
.secured(@guardian)
|
|
|
|
.listable_topics
|
2016-01-27 19:12:12 -05:00
|
|
|
.visible
|
2016-01-19 23:11:52 -05:00
|
|
|
.where(user: @user)
|
2016-03-30 12:05:16 -04:00
|
|
|
.order('like_count DESC, created_at ASC')
|
2016-01-19 23:11:52 -05:00
|
|
|
.includes(:user, :category)
|
2016-04-13 17:02:51 -04:00
|
|
|
.limit(MAX_SUMMARY_RESULTS)
|
2016-01-19 23:11:52 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def replies
|
|
|
|
Post
|
|
|
|
.secured(@guardian)
|
2016-03-30 12:05:16 -04:00
|
|
|
.includes(:user, topic: :category)
|
2016-01-27 19:12:12 -05:00
|
|
|
.references(:topic)
|
|
|
|
.merge(Topic.listable_topics.visible.secured(@guardian))
|
2016-01-19 23:11:52 -05:00
|
|
|
.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')
|
2016-04-13 17:02:51 -04:00
|
|
|
.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
|
2016-01-19 23:11:52 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def badges
|
2016-03-30 12:05:16 -04:00
|
|
|
@user.featured_user_badges(MAX_BADGES)
|
2016-01-19 23:11:52 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def user_stat
|
|
|
|
@user.user_stat
|
|
|
|
end
|
|
|
|
|
2016-04-13 17:02:51 -04:00
|
|
|
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,
|
2016-01-19 23:11:52 -05:00
|
|
|
to: :user_stat
|
|
|
|
|
|
|
|
end
|