From 0b00a7870b59066b490570644b8880b3ca300211 Mon Sep 17 00:00:00 2001 From: Claudio Costa Date: Thu, 21 Nov 2019 16:08:47 +0100 Subject: [PATCH] Invalidate channel members cache when promoting/demoting a guest (#13180) --- app/user.go | 4 ++++ app/user_test.go | 54 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/app/user.go b/app/user.go index f491a0d841..9f109d82ee 100644 --- a/app/user.go +++ b/app/user.go @@ -2293,6 +2293,8 @@ func (a *App) PromoteGuestToUser(user *model.User, requestorId string) *model.Ap } for _, member := range *channelMembers { + a.InvalidateCacheForChannelMembers(member.ChannelId) + evt := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_CHANNEL_MEMBER_UPDATED, "", "", user.Id, nil) evt.Add("channelMember", member.ToJson()) a.Publish(evt) @@ -2332,6 +2334,8 @@ func (a *App) DemoteUserToGuest(user *model.User) *model.AppError { } for _, member := range *channelMembers { + a.InvalidateCacheForChannelMembers(member.ChannelId) + evt := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_CHANNEL_MEMBER_UPDATED, "", "", user.Id, nil) evt.Add("channelMember", member.ToJson()) a.Publish(evt) diff --git a/app/user_test.go b/app/user_test.go index d8cf99bd80..ee455c1cfd 100644 --- a/app/user_test.go +++ b/app/user_test.go @@ -1052,12 +1052,64 @@ func TestPromoteGuestToUser(t *testing.T) { require.Nil(t, err) assert.Len(t, *channelMembers, 3) }) + + t.Run("Must invalidate channel stats cache when promoting a guest", func(t *testing.T) { + guest := th.CreateGuest() + require.Equal(t, "system_guest", guest.Roles) + th.LinkUserToTeam(guest, th.BasicTeam) + teamMember, err := th.App.GetTeamMember(th.BasicTeam.Id, guest.Id) + require.Nil(t, err) + require.True(t, teamMember.SchemeGuest) + require.False(t, teamMember.SchemeUser) + + guestCount, _ := th.App.GetChannelGuestCount(th.BasicChannel.Id) + require.Equal(t, int64(0), guestCount) + + channelMember := th.AddUserToChannel(guest, th.BasicChannel) + require.True(t, channelMember.SchemeGuest) + require.False(t, channelMember.SchemeUser) + + guestCount, _ = th.App.GetChannelGuestCount(th.BasicChannel.Id) + require.Equal(t, int64(1), guestCount) + + err = th.App.PromoteGuestToUser(guest, th.BasicUser.Id) + require.Nil(t, err) + + guestCount, _ = th.App.GetChannelGuestCount(th.BasicChannel.Id) + require.Equal(t, int64(0), guestCount) + }) } func TestDemoteUserToGuest(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() + t.Run("Must invalidate channel stats cache when demoting a user", func(t *testing.T) { + user := th.CreateUser() + require.Equal(t, "system_user", user.Roles) + th.LinkUserToTeam(user, th.BasicTeam) + teamMember, err := th.App.GetTeamMember(th.BasicTeam.Id, user.Id) + require.Nil(t, err) + require.True(t, teamMember.SchemeUser) + require.False(t, teamMember.SchemeGuest) + + guestCount, _ := th.App.GetChannelGuestCount(th.BasicChannel.Id) + require.Equal(t, int64(0), guestCount) + + channelMember := th.AddUserToChannel(user, th.BasicChannel) + require.True(t, channelMember.SchemeUser) + require.False(t, channelMember.SchemeGuest) + + guestCount, _ = th.App.GetChannelGuestCount(th.BasicChannel.Id) + require.Equal(t, int64(0), guestCount) + + err = th.App.DemoteUserToGuest(user) + require.Nil(t, err) + + guestCount, _ = th.App.GetChannelGuestCount(th.BasicChannel.Id) + require.Equal(t, int64(1), guestCount) + }) + t.Run("Must fail with guest user", func(t *testing.T) { guest := th.CreateGuest() require.Equal(t, "system_guest", guest.Roles) @@ -1100,7 +1152,7 @@ func TestDemoteUserToGuest(t *testing.T) { assert.True(t, teamMember.SchemeGuest) }) - t.Run("Must work with user user with teams and channels", func(t *testing.T) { + t.Run("Must work with user with teams and channels", func(t *testing.T) { user := th.CreateUser() require.Equal(t, "system_user", user.Roles) th.LinkUserToTeam(user, th.BasicTeam)