FIX: `TopicQuery.list_private_messages_unread` ignore notification level

FIX: TopicQuery.list_private_messages_unread ignore notification level

diff --git a/lib/topic_query.rb b/lib/topic_query.rb
index a9ae978..710da62 100644
--- a/lib/topic_query.rb
+++ b/lib/topic_query.rb
@@ -328,7 +328,15 @@ class TopicQuery
 
   def list_private_messages_unread(user)
     list = private_messages_for(user, :user)
-    list = list.where("tu.last_read_post_number IS NULL OR tu.last_read_post_number < topics.highest_post_number")
+
+    list = TopicQuery.unread_filter(
+      list,
+      user.id,
+      staff: user.staff?
+    )
+
+    first_unread_pm_at = UserStat.where(user_id: user.id).pluck(:first_unread_pm_at).first
+    list = list.where("topics.updated_at >= ?", first_unread_pm_at) if first_unread_pm_at
     create_list(:private_messages, {}, list)
   end
 
diff --git a/spec/requests/list_controller_spec.rb b/spec/requests/list_controller_spec.rb
index 349da25..3b54f45 100644
--- a/spec/requests/list_controller_spec.rb
+++ b/spec/requests/list_controller_spec.rb
@@ -638,26 +638,35 @@ RSpec.describe ListController do
     end
   end
 
-  describe "private_messages_unread" do
-    before do
-      u = Fabricate(:user)
-      pm = Fabricate(:private_message_topic, user: u)
-      Fabricate(:post, user: u, topic: pm, post_number: 1)
-      pm.topic_allowed_users.create!(user: user)
+  describe "#private_messages_unread" do
+    fab!(:pm_user) { Fabricate(:user) }
+
+    fab!(:pm) do
+      Fabricate(:private_message_topic).tap do |t|
+        t.allowed_users << pm_user
+        create_post(user: pm_user, topic_id: t.id)
+      end
     end
 
     it "returns 403 error when the user can't see private message" do
       sign_in(Fabricate(:user))
-      get "/topics/private-messages-unread/#{user.username}.json"
-      expect(response).to be_forbidden
+      get "/topics/private-messages-unread/#{pm_user.username}.json"
+      expect(response.status).to eq(403)
     end
 
     it "succeeds when the user can see private messages" do
-      sign_in(user)
-      get "/topics/private-messages-unread/#{user.username}.json"
+      TopicUser.find_by(topic: pm, user: pm_user).update!(
+        notification_level: TopicUser.notification_levels[:tracking],
+        last_read_post_number: 0,
+      )
+
+      sign_in(pm_user)
+      get "/topics/private-messages-unread/#{pm_user.username}.json"
+
       expect(response.status).to eq(200)
       json = response.parsed_body
       expect(json["topic_list"]["topics"].size).to eq(1)
+      expect(json["topic_list"]["topics"][0]["id"]).to eq(pm.id)
     end
   end
 

GitHub sha: 2ff16b36