From 83197ec5ff949df3a26d8410c44a646fce7b3f04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Fri, 16 Aug 2019 08:39:34 +0200 Subject: [PATCH] Fixing websockets updates for promote/demote (#11799) * Fixing websockets updates for promote/demote * Adding extra test check * Addressing PR comments --- app/user.go | 54 ++++++++++++++++++++++++++++------- store/sqlstore/user_store.go | 4 +++ store/storetest/user_store.go | 2 ++ 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/app/user.go b/app/user.go index 0f7f03caed..cb6b7f9cbc 100644 --- a/app/user.go +++ b/app/user.go @@ -2247,14 +2247,31 @@ func (a *App) PromoteGuestToUser(user *model.User, requestorId string) *model.Ap promotedUser, err := a.GetUser(user.Id) if err != nil { - return err + mlog.Error(err.Error()) + } else { + a.sendUpdatedUserEvent(*promotedUser) + a.UpdateSessionsIsGuest(promotedUser.Id, promotedUser.IsGuest()) } - message := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_USER_UPDATED, "", "", "", nil) - message.Add("user", promotedUser) - a.Publish(message) + teamMembers, err := a.GetTeamMembersForUser(user.Id) + if err != nil { + mlog.Error(err.Error()) + } - a.UpdateSessionsIsGuest(promotedUser.Id, promotedUser.IsGuest()) + for _, member := range teamMembers { + a.sendUpdatedMemberRoleEvent(user.Id, member) + + channelMembers, err := a.GetChannelMembersForUser(member.TeamId, user.Id) + if err != nil { + mlog.Error(err.Error()) + } + + for _, member := range *channelMembers { + evt := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_CHANNEL_MEMBER_UPDATED, "", "", user.Id, nil) + evt.Add("channelMember", member.ToJson()) + a.Publish(evt) + } + } return nil } @@ -2269,14 +2286,31 @@ func (a *App) DemoteUserToGuest(user *model.User) *model.AppError { demotedUser, err := a.GetUser(user.Id) if err != nil { - return err + mlog.Error(err.Error()) + } else { + a.sendUpdatedUserEvent(*demotedUser) + a.UpdateSessionsIsGuest(demotedUser.Id, demotedUser.IsGuest()) } - message := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_USER_UPDATED, "", "", "", nil) - message.Add("user", demotedUser) - a.Publish(message) + teamMembers, err := a.GetTeamMembersForUser(user.Id) + if err != nil { + mlog.Error(err.Error()) + } - a.UpdateSessionsIsGuest(demotedUser.Id, demotedUser.IsGuest()) + for _, member := range teamMembers { + a.sendUpdatedMemberRoleEvent(user.Id, member) + + channelMembers, err := a.GetChannelMembersForUser(member.TeamId, user.Id) + if err != nil { + mlog.Error(err.Error()) + } + + for _, member := range *channelMembers { + evt := model.NewWebSocketEvent(model.WEBSOCKET_EVENT_CHANNEL_MEMBER_UPDATED, "", "", user.Id, nil) + evt.Add("channelMember", member.ToJson()) + a.Publish(evt) + } + } return nil } diff --git a/store/sqlstore/user_store.go b/store/sqlstore/user_store.go index 65eae6eb22..2f16172453 100644 --- a/store/sqlstore/user_store.go +++ b/store/sqlstore/user_store.go @@ -1635,8 +1635,10 @@ func (us SqlUserStore) PromoteGuestToUser(userId string) *model.AppError { } } + curTime := model.GetMillis() query := us.getQueryBuilder().Update("Users"). Set("Roles", strings.Join(roles, " ")). + Set("UpdateAt", curTime). Where(sq.Eq{"Id": userId}) queryString, args, err := query.ToSql() @@ -1705,8 +1707,10 @@ func (us SqlUserStore) DemoteUserToGuest(userId string) *model.AppError { } } + curTime := model.GetMillis() query := us.getQueryBuilder().Update("Users"). Set("Roles", strings.Join(newRoles, " ")). + Set("UpdateAt", curTime). Where(sq.Eq{"Id": userId}) queryString, args, err := query.ToSql() diff --git a/store/storetest/user_store.go b/store/storetest/user_store.go index 04ec140fed..58eed620ff 100644 --- a/store/storetest/user_store.go +++ b/store/storetest/user_store.go @@ -4280,6 +4280,7 @@ func testUserStorePromoteGuestToUser(t *testing.T, ss store.Store) { updatedUser, err := ss.User().Get(user.Id) assert.Nil(t, err) require.Equal(t, "system_user", updatedUser.Roles) + require.True(t, user.UpdateAt < updatedUser.UpdateAt) updatedTeamMember, err := ss.Team().GetMember(teamId, user.Id) require.Nil(t, err) @@ -4586,6 +4587,7 @@ func testUserStoreDemoteUserToGuest(t *testing.T, ss store.Store) { updatedUser, err := ss.User().Get(user.Id) assert.Nil(t, err) require.Equal(t, "system_guest", updatedUser.Roles) + require.True(t, user.UpdateAt < updatedUser.UpdateAt) updatedTeamMember, err := ss.Team().GetMember(teamId, user.Id) require.Nil(t, err)