From 8c453bbcca063f4d07a75b1fcbbc2515b9826244 Mon Sep 17 00:00:00 2001 From: Eli Yukelzon Date: Thu, 22 Apr 2021 16:30:43 +0300 Subject: [PATCH] MM-34895 CRT: Replying to a root post with an at-mention triggers an unread mention (#17474) * don't count your own replies as unread * corrected totalUnreadThreads query --- api4/user_test.go | 4 ++-- store/sqlstore/thread_store.go | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/api4/user_test.go b/api4/user_test.go index b2087e4f81..29a9fa0849 100644 --- a/api4/user_test.go +++ b/api4/user_test.go @@ -5675,8 +5675,8 @@ func checkThreadListReplies(t *testing.T, th *TestHelper, client *model.Client4, } sum += thr.UnreadReplies } - require.EqualValues(t, expectedReplies, sum) - require.Equal(t, count, u.TotalUnreadThreads) + require.EqualValues(t, expectedReplies, sum, "expectedReplies don't match") + require.Equal(t, count, u.TotalUnreadThreads, "TotalUnreadThreads don't match") return u, r } diff --git a/store/sqlstore/thread_store.go b/store/sqlstore/thread_store.go index 56acbd128a..cea2bfe871 100644 --- a/store/sqlstore/thread_store.go +++ b/store/sqlstore/thread_store.go @@ -142,11 +142,12 @@ func (s *SqlThreadStore) GetThreadsForUser(userId, teamId string, opts model.Get threadsChan := make(chan store.StoreResult, 1) go func() { repliesQuery, repliesQueryArgs, _ := s.getQueryBuilder(). - Select("COUNT(Posts.Id)"). + Select("COUNT(DISTINCT(Posts.RootId))"). From("Posts"). - LeftJoin("ThreadMemberships ON Posts.Id = ThreadMemberships.PostId"). + LeftJoin("ThreadMemberships ON Posts.RootId = ThreadMemberships.PostId"). LeftJoin("Channels ON Posts.ChannelId = Channels.Id"). Where(fetchConditions). + Where(sq.NotEq{"Posts.UserId": userId}). Where("Posts.UpdateAt >= ThreadMemberships.LastViewed").ToSql() totalUnreadThreads, err := s.GetMaster().SelectInt(repliesQuery, repliesQueryArgs...) @@ -319,7 +320,7 @@ func (s *SqlThreadStore) GetThreadForUser(userId, teamId, threadId string, exten model.Post } - unreadRepliesQuery := "SELECT COUNT(Posts.Id) From Posts Where Posts.RootId=ThreadMemberships.PostId AND Posts.UpdateAt >= ThreadMemberships.LastViewed AND Posts.DeleteAt=0" + unreadRepliesQuery := "SELECT COUNT(Posts.Id) From Posts Where Posts.RootId=ThreadMemberships.PostId AND Posts.UpdateAt >= ThreadMemberships.LastViewed AND Posts.DeleteAt=0 AND Posts.UserId != ?" fetchConditions := sq.And{ sq.Or{sq.Eq{"Channels.TeamId": teamId}, sq.Eq{"Channels.TeamId": ""}}, sq.Eq{"ThreadMemberships.UserId": userId}, @@ -330,7 +331,7 @@ func (s *SqlThreadStore) GetThreadForUser(userId, teamId, threadId string, exten query, args, _ := s.getQueryBuilder(). Select("Threads.*, Posts.*, ThreadMemberships.LastViewed as LastViewedAt, ThreadMemberships.UnreadMentions as UnreadMentions, ThreadMemberships.Following"). From("Threads"). - Column(sq.Alias(sq.Expr(unreadRepliesQuery), "UnreadReplies")). + Column(sq.Alias(sq.Expr(unreadRepliesQuery, userId), "UnreadReplies")). LeftJoin("Posts ON Posts.Id = Threads.PostId"). LeftJoin("Channels ON Posts.ChannelId = Channels.Id"). LeftJoin("ThreadMemberships ON ThreadMemberships.PostId = Threads.PostId").