MM-33708 - Add MentionCountRoot column to ChannelMembers (#17099)
* added new column for root-only mentions Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
3c21eef110
Коммит
480796a1df
@@ -2152,6 +2152,7 @@ func TestViewChannel(t *testing.T) {
|
||||
CheckNoError(t, resp)
|
||||
require.Equal(t, channel.TotalMsgCount, member.MsgCount, "should match message counts")
|
||||
require.Equal(t, int64(0), member.MentionCount, "should have no mentions")
|
||||
require.Equal(t, int64(0), member.MentionCountRoot, "should have no mentions")
|
||||
|
||||
_, resp = Client.ViewChannel("junk", view)
|
||||
CheckBadRequestStatus(t, resp)
|
||||
@@ -4064,3 +4065,43 @@ func TestMoveChannel(t *testing.T) {
|
||||
require.Equal(t, team2.Id, newChannel.TeamId)
|
||||
}, "Should be able to (force) move private channel by a member that is not member of target team")
|
||||
}
|
||||
|
||||
func TestRootMentionsCount(t *testing.T) {
|
||||
th := Setup(t).InitBasic()
|
||||
defer th.TearDown()
|
||||
Client := th.Client
|
||||
user := th.BasicUser
|
||||
channel := th.BasicChannel
|
||||
|
||||
// initially, MentionCountRoot is 0 in the database
|
||||
channelMember, err := th.App.Srv().Store.Channel().GetMember(context.Background(), channel.Id, user.Id)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, int64(0), channelMember.MentionCountRoot)
|
||||
require.Equal(t, int64(0), channelMember.MentionCount)
|
||||
|
||||
// mention the user in a root post
|
||||
post1, resp := th.SystemAdminClient.CreatePost(&model.Post{ChannelId: channel.Id, Message: "hey @" + user.Username})
|
||||
CheckNoError(t, resp)
|
||||
// mention the user in a reply post
|
||||
post2 := &model.Post{ChannelId: channel.Id, Message: "reply at @" + user.Username, RootId: post1.Id}
|
||||
_, resp = th.SystemAdminClient.CreatePost(post2)
|
||||
CheckNoError(t, resp)
|
||||
|
||||
// this should perform lazy migration and populate the field
|
||||
channelUnread, resp := Client.GetChannelUnread(channel.Id, user.Id)
|
||||
CheckNoError(t, resp)
|
||||
// reply post is not counted, so we should have one root mention
|
||||
require.EqualValues(t, int64(1), channelUnread.MentionCountRoot)
|
||||
// regular count stays the same
|
||||
require.Equal(t, int64(2), channelUnread.MentionCount)
|
||||
// validate that DB is updated
|
||||
channelMember, err = th.App.Srv().Store.Channel().GetMember(context.Background(), channel.Id, user.Id)
|
||||
require.NoError(t, err)
|
||||
require.EqualValues(t, int64(1), channelMember.MentionCountRoot)
|
||||
|
||||
// validate that Team level counts are calculated
|
||||
counts, appErr := th.App.GetTeamUnread(channel.TeamId, user.Id)
|
||||
require.Nil(t, appErr)
|
||||
require.Equal(t, int64(1), counts.MentionCountRoot)
|
||||
require.Equal(t, int64(2), counts.MentionCount)
|
||||
}
|
||||
|
||||
21
api4/user.go
21
api4/user.go
@@ -94,7 +94,6 @@ func (api *API) InitUser() {
|
||||
|
||||
api.BaseRoutes.UserThreads.Handle("", api.ApiSessionRequired(getThreadsForUser)).Methods("GET")
|
||||
api.BaseRoutes.UserThreads.Handle("/read", api.ApiSessionRequired(updateReadStateAllThreadsByUser)).Methods("PUT")
|
||||
api.BaseRoutes.UserThreads.Handle("/mention_counts", api.ApiSessionRequired(getMentionCountsForAllThreadsByUser)).Methods("GET")
|
||||
|
||||
api.BaseRoutes.UserThread.Handle("", api.ApiSessionRequired(getThreadForUser)).Methods("GET")
|
||||
api.BaseRoutes.UserThread.Handle("/following", api.ApiSessionRequired(followThreadByUser)).Methods("PUT")
|
||||
@@ -2871,26 +2870,6 @@ func getThreadForUser(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
w.Write([]byte(threads.ToJson()))
|
||||
}
|
||||
|
||||
func getMentionCountsForAllThreadsByUser(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
c.RequireUserId().RequireTeamId()
|
||||
if c.Err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if !c.App.SessionHasPermissionToUser(*c.App.Session(), c.Params.UserId) {
|
||||
c.SetPermissionError(model.PERMISSION_EDIT_OTHER_USERS)
|
||||
return
|
||||
}
|
||||
counts, err := c.App.GetThreadMentionsForUserPerChannel(c.Params.UserId, c.Params.TeamId)
|
||||
if err != nil {
|
||||
c.Err = err
|
||||
return
|
||||
}
|
||||
resp, _ := json.Marshal(counts)
|
||||
|
||||
w.Write(resp)
|
||||
}
|
||||
|
||||
func getThreadsForUser(c *Context, w http.ResponseWriter, r *http.Request) {
|
||||
c.RequireUserId().RequireTeamId()
|
||||
if c.Err != nil {
|
||||
|
||||
@@ -5840,11 +5840,6 @@ func TestMaintainUnreadMentionsInThread(t *testing.T) {
|
||||
*cfg.ServiceSettings.ThreadAutoFollow = true
|
||||
*cfg.ServiceSettings.CollapsedThreads = model.COLLAPSED_THREADS_DEFAULT_ON
|
||||
})
|
||||
checkMentionCounts := func(client *model.Client4, userId string, expected map[string]int64) {
|
||||
actual, resp2 := client.GetThreadMentionsForUserPerChannel(userId, th.BasicTeam.Id)
|
||||
CheckNoError(t, resp2)
|
||||
require.EqualValues(t, expected, actual)
|
||||
}
|
||||
checkThreadList := func(client *model.Client4, userId string, expectedMentions, expectedThreads int) (*model.Threads, *model.Response) {
|
||||
uss, resp := client.GetUserThreads(userId, th.BasicTeam.Id, model.GetUserThreadsOpts{
|
||||
Deleted: false,
|
||||
@@ -5870,7 +5865,6 @@ func TestMaintainUnreadMentionsInThread(t *testing.T) {
|
||||
// create reply and mention the original poster and another user
|
||||
postAndCheck(t, th.SystemAdminClient, &model.Post{ChannelId: th.BasicChannel.Id, Message: "testReply @" + th.BasicUser.Username + " and @" + th.BasicUser2.Username, RootId: rpost.Id})
|
||||
|
||||
checkMentionCounts(Client, th.BasicUser.Id, map[string]int64{th.BasicChannel.Id: 1})
|
||||
// basic user 1 was mentioned 1 time
|
||||
checkThreadList(th.Client, th.BasicUser.Id, 1, 1)
|
||||
// basic user 2 was mentioned 1 time
|
||||
@@ -5899,7 +5893,6 @@ func TestMaintainUnreadMentionsInThread(t *testing.T) {
|
||||
postAndCheck(t, th.SystemAdminClient, &model.Post{ChannelId: dm.Id, Message: "msg2", RootId: dm_root_post.Id})
|
||||
// expect increment by two mentions
|
||||
checkThreadList(th.Client, th.BasicUser.Id, 3, 2)
|
||||
checkMentionCounts(Client, th.BasicUser.Id, map[string]int64{th.BasicChannel.Id: 1, dm.Id: 2})
|
||||
}
|
||||
|
||||
func TestReadThreads(t *testing.T) {
|
||||
|
||||
Ссылка в новой задаче
Block a user