2015-03-17 03:14:33 +08:00
|
|
|
class DirectoryItemsController < ApplicationController
|
|
|
|
PAGE_SIZE = 50
|
|
|
|
|
|
|
|
def index
|
2015-03-26 23:26:19 +08:00
|
|
|
raise Discourse::InvalidAccess.new(:enable_user_directory) unless SiteSetting.enable_user_directory?
|
|
|
|
|
2015-03-19 23:48:16 +08:00
|
|
|
period = params.require(:period)
|
|
|
|
period_type = DirectoryItem.period_types[period.to_sym]
|
2015-03-17 03:14:33 +08:00
|
|
|
raise Discourse::InvalidAccess.new(:period_type) unless period_type
|
|
|
|
|
|
|
|
result = DirectoryItem.where(period_type: period_type).includes(:user)
|
|
|
|
|
2018-05-16 22:20:17 +08:00
|
|
|
if params[:group]
|
|
|
|
result = result.includes(user: :groups).where(users: {groups: {name: params[:group]}})
|
|
|
|
end
|
|
|
|
|
|
|
|
if params[:exclude_usernames]
|
|
|
|
result = result.references(:user).where.not(users: {username: params[:exclude_usernames].split(",")})
|
|
|
|
end
|
|
|
|
|
2015-03-17 03:14:33 +08:00
|
|
|
order = params[:order] || DirectoryItem.headings.first
|
|
|
|
if DirectoryItem.headings.include?(order.to_sym)
|
|
|
|
dir = params[:asc] ? 'ASC' : 'DESC'
|
|
|
|
result = result.order("directory_items.#{order} #{dir}")
|
|
|
|
end
|
|
|
|
|
|
|
|
if period_type == DirectoryItem.period_types[:all]
|
|
|
|
result = result.includes(:user_stat)
|
|
|
|
end
|
|
|
|
page = params[:page].to_i
|
2015-03-20 03:31:29 +08:00
|
|
|
|
2015-03-20 06:07:31 +08:00
|
|
|
user_ids = nil
|
|
|
|
if params[:name].present?
|
2017-11-19 08:17:31 +08:00
|
|
|
user_ids = UserSearch.new(params[:name], include_staged_users: true).search.pluck(:id)
|
2015-03-20 06:07:31 +08:00
|
|
|
if user_ids.present?
|
|
|
|
# Add the current user if we have at least one other match
|
2017-08-24 06:54:51 +08:00
|
|
|
if current_user && result.dup.where(user_id: user_ids).exists?
|
2015-03-20 06:07:31 +08:00
|
|
|
user_ids << current_user.id
|
|
|
|
end
|
|
|
|
result = result.where(user_id: user_ids)
|
|
|
|
else
|
|
|
|
result = result.where('false')
|
|
|
|
end
|
|
|
|
end
|
2015-03-20 03:31:29 +08:00
|
|
|
|
2015-12-30 12:00:00 +08:00
|
|
|
if params[:username]
|
|
|
|
user_id = User.where(username_lower: params[:username].to_s.downcase).pluck(:id).first
|
|
|
|
if user_id
|
|
|
|
result = result.where(user_id: user_id)
|
|
|
|
else
|
|
|
|
result = result.where('false')
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-10-15 01:13:58 +08:00
|
|
|
result_count = result.count
|
2015-03-20 06:07:31 +08:00
|
|
|
result = result.limit(PAGE_SIZE).offset(PAGE_SIZE * page).to_a
|
2015-03-17 03:14:33 +08:00
|
|
|
|
2017-08-31 12:06:56 +08:00
|
|
|
more_params = params.slice(:period, :order, :asc).permit!
|
2015-03-17 03:14:33 +08:00
|
|
|
more_params[:page] = page + 1
|
|
|
|
|
2015-03-25 04:19:15 +08:00
|
|
|
# Put yourself at the top of the first page
|
2015-04-03 02:51:49 +08:00
|
|
|
if result.present? && current_user.present? && page == 0
|
|
|
|
|
2017-07-28 09:20:09 +08:00
|
|
|
position = result.index { |r| r.user_id == current_user.id }
|
2015-04-03 02:51:49 +08:00
|
|
|
|
|
|
|
# Don't show the record unless you're not in the top positions already
|
|
|
|
if (position || 10) >= 10
|
|
|
|
your_item = DirectoryItem.where(period_type: period_type, user_id: current_user.id).first
|
|
|
|
result.insert(0, your_item) if your_item
|
|
|
|
end
|
|
|
|
|
2015-03-25 04:19:15 +08:00
|
|
|
end
|
2015-03-17 03:14:33 +08:00
|
|
|
|
2015-03-25 04:19:15 +08:00
|
|
|
render_json_dump(directory_items: serialize_data(result, DirectoryItemSerializer),
|
|
|
|
total_rows_directory_items: result_count,
|
|
|
|
load_more_directory_items: directory_items_path(more_params))
|
2015-03-17 03:14:33 +08:00
|
|
|
end
|
|
|
|
end
|