mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 04:11:12 +08:00
FEATURE: New and Unread messages for user personal messages. (#13603)
* FEATURE: New and Unread messages for user personal messages. Co-authored-by: awesomerobot <kris.aubuchon@discourse.org>
This commit is contained in:

committed by
GitHub

parent
fe3e18f981
commit
016efeadf6
@ -6,6 +6,8 @@
|
||||
#
|
||||
|
||||
class TopicQuery
|
||||
include PrivateMessageLists
|
||||
|
||||
PG_MAX_INT ||= 2147483647
|
||||
DEFAULT_PER_PAGE_COUNT ||= 30
|
||||
|
||||
@ -293,12 +295,6 @@ class TopicQuery
|
||||
end
|
||||
end
|
||||
|
||||
def not_archived(list, user)
|
||||
list.joins("LEFT JOIN user_archived_messages um
|
||||
ON um.user_id = #{user.id.to_i} AND um.topic_id = topics.id")
|
||||
.where('um.user_id IS NULL')
|
||||
end
|
||||
|
||||
def list_group_topics(group)
|
||||
list = default_results.where("
|
||||
topics.user_id IN (
|
||||
@ -309,79 +305,6 @@ class TopicQuery
|
||||
create_list(:group_topics, {}, list)
|
||||
end
|
||||
|
||||
def list_private_messages(user)
|
||||
list = private_messages_for(user, :user)
|
||||
|
||||
list = not_archived(list, user)
|
||||
.where('NOT (topics.participant_count = 1 AND topics.user_id = ? AND topics.moderator_posts_count = 0)', user.id)
|
||||
|
||||
create_list(:private_messages, {}, list)
|
||||
end
|
||||
|
||||
def list_private_messages_archive(user)
|
||||
list = private_messages_for(user, :user)
|
||||
list = list.joins(:user_archived_messages).where('user_archived_messages.user_id = ?', user.id)
|
||||
create_list(:private_messages, {}, list)
|
||||
end
|
||||
|
||||
def list_private_messages_sent(user)
|
||||
list = private_messages_for(user, :user)
|
||||
list = list.where('EXISTS (
|
||||
SELECT 1 FROM posts
|
||||
WHERE posts.topic_id = topics.id AND
|
||||
posts.user_id = ?
|
||||
)', user.id)
|
||||
list = not_archived(list, user)
|
||||
create_list(:private_messages, {}, list)
|
||||
end
|
||||
|
||||
def list_private_messages_unread(user)
|
||||
list = private_messages_for(user, :user)
|
||||
|
||||
list = TopicQuery.unread_filter(
|
||||
list,
|
||||
staff: user.staff?
|
||||
)
|
||||
|
||||
first_unread_pm_at = UserStat.where(user_id: user.id).pluck_first(:first_unread_pm_at)
|
||||
list = list.where("topics.updated_at >= ?", first_unread_pm_at) if first_unread_pm_at
|
||||
create_list(:private_messages, {}, list)
|
||||
end
|
||||
|
||||
def list_private_messages_group(user)
|
||||
list = private_messages_for(user, :group)
|
||||
group = Group.where('name ilike ?', @options[:group_name]).select(:id, :publish_read_state).first
|
||||
publish_read_state = !!group&.publish_read_state
|
||||
list = list.joins("LEFT JOIN group_archived_messages gm ON gm.topic_id = topics.id AND
|
||||
gm.group_id = #{group&.id&.to_i}")
|
||||
list = list.where("gm.id IS NULL")
|
||||
list = append_read_state(list, group) if publish_read_state
|
||||
create_list(:private_messages, { publish_read_state: publish_read_state }, list)
|
||||
end
|
||||
|
||||
def list_private_messages_group_archive(user)
|
||||
list = private_messages_for(user, :group)
|
||||
group_id = Group.where('name ilike ?', @options[:group_name]).pluck_first(:id)
|
||||
list = list.joins("JOIN group_archived_messages gm ON gm.topic_id = topics.id AND
|
||||
gm.group_id = #{group_id.to_i}")
|
||||
create_list(:private_messages, {}, list)
|
||||
end
|
||||
|
||||
def list_private_messages_tag(user)
|
||||
list = private_messages_for(user, :all)
|
||||
list = list.joins("JOIN topic_tags tt ON tt.topic_id = topics.id
|
||||
JOIN tags t ON t.id = tt.tag_id AND t.name = '#{@options[:tags][0]}'")
|
||||
create_list(:private_messages, {}, list)
|
||||
end
|
||||
|
||||
def list_private_messages_warnings(user)
|
||||
list = private_messages_for(user, :user)
|
||||
list = list.where('topics.subtype = ?', TopicSubtype.moderator_warning)
|
||||
# Exclude official warnings that the user created, instead of received
|
||||
list = list.where('topics.user_id <> ?', user.id)
|
||||
create_list(:private_messages, {}, list)
|
||||
end
|
||||
|
||||
def list_category_topic_ids(category)
|
||||
query = default_results(category: category.id)
|
||||
pinned_ids = query.where('topics.pinned_at IS NOT NULL AND topics.category_id = ?', category.id).limit(nil).order('pinned_at DESC').pluck(:id)
|
||||
@ -590,50 +513,6 @@ class TopicQuery
|
||||
DEFAULT_PER_PAGE_COUNT
|
||||
end
|
||||
|
||||
def private_messages_for(user, type)
|
||||
options = @options
|
||||
options.reverse_merge!(per_page: per_page_setting)
|
||||
|
||||
result = Topic.includes(:allowed_users)
|
||||
result = result.includes(:tags) if SiteSetting.tagging_enabled
|
||||
|
||||
if type == :group
|
||||
result = result.joins(
|
||||
"INNER JOIN topic_allowed_groups tag ON tag.topic_id = topics.id AND tag.group_id IN (SELECT id FROM groups WHERE LOWER(name) = '#{PG::Connection.escape_string(@options[:group_name].downcase)}')"
|
||||
)
|
||||
|
||||
unless user.admin?
|
||||
result = result.joins("INNER JOIN group_users gu ON gu.group_id = tag.group_id AND gu.user_id = #{user.id.to_i}")
|
||||
end
|
||||
elsif type == :user
|
||||
result = result.where("topics.id IN (SELECT topic_id FROM topic_allowed_users WHERE user_id = #{user.id.to_i})")
|
||||
elsif type == :all
|
||||
result = result.where("topics.id IN (
|
||||
SELECT topic_id
|
||||
FROM topic_allowed_users
|
||||
WHERE user_id = #{user.id.to_i}
|
||||
UNION ALL
|
||||
SELECT topic_id FROM topic_allowed_groups
|
||||
WHERE group_id IN (
|
||||
SELECT group_id FROM group_users WHERE user_id = #{user.id.to_i}
|
||||
)
|
||||
)")
|
||||
end
|
||||
|
||||
result = result.joins("LEFT OUTER JOIN topic_users AS tu ON (topics.id = tu.topic_id AND tu.user_id = #{user.id.to_i})")
|
||||
.order("topics.bumped_at DESC")
|
||||
.private_messages
|
||||
|
||||
result = result.limit(options[:per_page]) unless options[:limit] == false
|
||||
result = result.visible if options[:visible] || @user.nil? || @user.regular?
|
||||
|
||||
if options[:page]
|
||||
offset = options[:page].to_i * options[:per_page]
|
||||
result = result.offset(offset) if offset > 0
|
||||
end
|
||||
result
|
||||
end
|
||||
|
||||
def apply_shared_drafts(result, category_id, options)
|
||||
|
||||
# PERF: avoid any penalty if there are no shared drafts enabled
|
||||
@ -955,7 +834,7 @@ class TopicQuery
|
||||
list
|
||||
end
|
||||
|
||||
def remove_muted_tags(list, user, opts = nil)
|
||||
def remove_muted_tags(list, user, opts = {})
|
||||
if !SiteSetting.tagging_enabled || SiteSetting.remove_muted_tags_from_latest == 'never'
|
||||
return list
|
||||
end
|
||||
@ -1149,18 +1028,4 @@ class TopicQuery
|
||||
|
||||
result.order('topics.bumped_at DESC')
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def append_read_state(list, group)
|
||||
group_id = group&.id
|
||||
return list if group_id.nil?
|
||||
|
||||
selected_values = list.select_values.empty? ? ['topics.*'] : list.select_values
|
||||
selected_values << "COALESCE(tg.last_read_post_number, 0) AS last_read_post_number"
|
||||
|
||||
list
|
||||
.joins("LEFT OUTER JOIN topic_groups tg ON topics.id = tg.topic_id AND tg.group_id = #{group_id}")
|
||||
.select(*selected_values)
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user