[MM-21517] Team Member Manage User Modal not display correct roles (#14043)
* join on the users table and order by username * don't inclue users who have been deleted * Address PR comments * update tests * fix linting * fix linting * include ExcludeDeletedUsers flag * fix gofmt * fix nil teamMembersGetOptions * fix gofmt error * Add Unit Tests * fix gofmt bugs * partially address comments * fix incorrect import * Address Comments and fix golint errors * store mocks * address PR comments about tests and styling * Update model/team_member.go Co-Authored-By: Jesse Hallam <jesse.hallam@gmail.com> * Address PR comments * update client function name Co-authored-by: mattermod <mattermod@users.noreply.github.com> Co-authored-by: Jesse Hallam <jesse.hallam@gmail.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
7ce68e89d7
Коммит
bd2c1f4522
@@ -594,7 +594,7 @@ type AppIface interface {
|
||||
GetTeamIcon(team *model.Team) ([]byte, *model.AppError)
|
||||
GetTeamIdFromQuery(query url.Values) (string, *model.AppError)
|
||||
GetTeamMember(teamId, userId string) (*model.TeamMember, *model.AppError)
|
||||
GetTeamMembers(teamId string, offset int, limit int, restrictions *model.ViewUsersRestrictions) ([]*model.TeamMember, *model.AppError)
|
||||
GetTeamMembers(teamId string, offset int, limit int, teamMembersGetOptions *model.TeamMembersGetOptions) ([]*model.TeamMember, *model.AppError)
|
||||
GetTeamMembersByIds(teamId string, userIds []string, restrictions *model.ViewUsersRestrictions) ([]*model.TeamMember, *model.AppError)
|
||||
GetTeamMembersForUser(userId string) ([]*model.TeamMember, *model.AppError)
|
||||
GetTeamMembersForUserWithPagination(userId string, page, perPage int) ([]*model.TeamMember, *model.AppError)
|
||||
|
||||
@@ -7572,7 +7572,7 @@ func (a *OpenTracingAppLayer) GetTeamMember(teamId string, userId string) (*mode
|
||||
return resultVar0, resultVar1
|
||||
}
|
||||
|
||||
func (a *OpenTracingAppLayer) GetTeamMembers(teamId string, offset int, limit int, restrictions *model.ViewUsersRestrictions) ([]*model.TeamMember, *model.AppError) {
|
||||
func (a *OpenTracingAppLayer) GetTeamMembers(teamId string, offset int, limit int, teamMembersGetOptions *model.TeamMembersGetOptions) ([]*model.TeamMember, *model.AppError) {
|
||||
origCtx := a.ctx
|
||||
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.GetTeamMembers")
|
||||
|
||||
@@ -7584,7 +7584,7 @@ func (a *OpenTracingAppLayer) GetTeamMembers(teamId string, offset int, limit in
|
||||
}()
|
||||
|
||||
defer span.Finish()
|
||||
resultVar0, resultVar1 := a.app.GetTeamMembers(teamId, offset, limit, restrictions)
|
||||
resultVar0, resultVar1 := a.app.GetTeamMembers(teamId, offset, limit, teamMembersGetOptions)
|
||||
|
||||
if resultVar1 != nil {
|
||||
span.LogFields(spanlog.Error(resultVar1))
|
||||
|
||||
@@ -763,8 +763,8 @@ func (a *App) GetTeamMembersForUserWithPagination(userId string, page, perPage i
|
||||
return a.Srv().Store.Team().GetTeamsForUserWithPagination(userId, page, perPage)
|
||||
}
|
||||
|
||||
func (a *App) GetTeamMembers(teamId string, offset int, limit int, restrictions *model.ViewUsersRestrictions) ([]*model.TeamMember, *model.AppError) {
|
||||
return a.Srv().Store.Team().GetMembers(teamId, offset, limit, restrictions)
|
||||
func (a *App) GetTeamMembers(teamId string, offset int, limit int, teamMembersGetOptions *model.TeamMembersGetOptions) ([]*model.TeamMember, *model.AppError) {
|
||||
return a.Srv().Store.Team().GetMembers(teamId, offset, limit, teamMembersGetOptions)
|
||||
}
|
||||
|
||||
func (a *App) GetTeamMembersByIds(teamId string, userIds []string, restrictions *model.ViewUsersRestrictions) ([]*model.TeamMember, *model.AppError) {
|
||||
@@ -1591,7 +1591,7 @@ func (a *App) ClearTeamMembersCache(teamID string) {
|
||||
page := 0
|
||||
|
||||
for {
|
||||
teamMembers, err := a.Srv().Store.Team().GetMembers(teamID, page, perPage, &model.ViewUsersRestrictions{})
|
||||
teamMembers, err := a.Srv().Store.Team().GetMembers(teamID, page, perPage, nil)
|
||||
if err != nil {
|
||||
a.Log().Warn("error clearing cache for team members", mlog.String("team_id", teamID), mlog.String("err", err.Error()))
|
||||
break
|
||||
|
||||
103
app/team_test.go
103
app/team_test.go
@@ -5,6 +5,7 @@ package app
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"sort"
|
||||
"strings"
|
||||
"testing"
|
||||
@@ -825,15 +826,16 @@ func TestGetTeamMembers(t *testing.T) {
|
||||
th := Setup(t).InitBasic()
|
||||
defer th.TearDown()
|
||||
|
||||
var userIDs sort.StringSlice
|
||||
userIDs = append(userIDs, th.BasicUser.Id)
|
||||
userIDs = append(userIDs, th.BasicUser2.Id)
|
||||
var users []model.User
|
||||
users = append(users, *th.BasicUser)
|
||||
users = append(users, *th.BasicUser2)
|
||||
|
||||
for i := 0; i < 8; i++ {
|
||||
user := model.User{
|
||||
Email: strings.ToLower(model.NewId()) + "success+test@example.com",
|
||||
Username: fmt.Sprintf("user%v", i),
|
||||
Password: "passwd1",
|
||||
DeleteAt: int64(rand.Intn(2)),
|
||||
}
|
||||
ruser, err := th.App.CreateUser(&user)
|
||||
require.Nil(t, err)
|
||||
@@ -843,25 +845,90 @@ func TestGetTeamMembers(t *testing.T) {
|
||||
_, err = th.App.AddUserToTeam(th.BasicTeam.Id, ruser.Id, "")
|
||||
require.Nil(t, err)
|
||||
|
||||
// Store the user ids for comparison later
|
||||
userIDs = append(userIDs, ruser.Id)
|
||||
// Store the users for comparison later
|
||||
users = append(users, *ruser)
|
||||
}
|
||||
// Sort them because the result of GetTeamMembers() is also sorted
|
||||
sort.Sort(userIDs)
|
||||
|
||||
// Fetch team members multipile times
|
||||
members, err := th.App.GetTeamMembers(th.BasicTeam.Id, 0, 5, nil)
|
||||
require.Nil(t, err)
|
||||
t.Run("Ensure Sorted By Username when TeamMemberGet options is passed", func(t *testing.T) {
|
||||
members, err := th.App.GetTeamMembers(th.BasicTeam.Id, 0, 100, &model.TeamMembersGetOptions{Sort: model.USERNAME})
|
||||
require.Nil(t, err)
|
||||
|
||||
// This should return 5 members
|
||||
members2, err := th.App.GetTeamMembers(th.BasicTeam.Id, 5, 6, nil)
|
||||
require.Nil(t, err)
|
||||
members = append(members, members2...)
|
||||
// Sort the users array by username
|
||||
sort.Slice(users, func(i, j int) bool {
|
||||
return users[i].Username < users[j].Username
|
||||
})
|
||||
|
||||
require.Equal(t, len(userIDs), len(members))
|
||||
for i, member := range members {
|
||||
assert.Equal(t, userIDs[i], member.UserId)
|
||||
}
|
||||
// We should have the same number of users in both users and members array as we have not excluded any deleted members
|
||||
require.Equal(t, len(users), len(members))
|
||||
for i, member := range members {
|
||||
assert.Equal(t, users[i].Id, member.UserId)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("Ensure ExcludedDeletedUsers when TeamMemberGetOptions is passed", func(t *testing.T) {
|
||||
members, err := th.App.GetTeamMembers(th.BasicTeam.Id, 0, 100, &model.TeamMembersGetOptions{ExcludeDeletedUsers: true})
|
||||
require.Nil(t, err)
|
||||
|
||||
// Choose all users who aren't deleted from our users array
|
||||
var usersNotDeletedIDs []string
|
||||
var membersIDs []string
|
||||
for _, u := range users {
|
||||
if u.DeleteAt == 0 {
|
||||
usersNotDeletedIDs = append(usersNotDeletedIDs, u.Id)
|
||||
}
|
||||
}
|
||||
|
||||
for _, m := range members {
|
||||
membersIDs = append(membersIDs, m.UserId)
|
||||
}
|
||||
|
||||
require.Equal(t, len(usersNotDeletedIDs), len(membersIDs))
|
||||
require.ElementsMatch(t, usersNotDeletedIDs, membersIDs)
|
||||
})
|
||||
|
||||
t.Run("Ensure Sorted By Username and ExcludedDeletedUsers when TeamMemberGetOptions is passed", func(t *testing.T) {
|
||||
members, err := th.App.GetTeamMembers(th.BasicTeam.Id, 0, 100, &model.TeamMembersGetOptions{Sort: model.USERNAME, ExcludeDeletedUsers: true})
|
||||
require.Nil(t, err)
|
||||
|
||||
var usersNotDeleted []model.User
|
||||
for _, u := range users {
|
||||
if u.DeleteAt == 0 {
|
||||
usersNotDeleted = append(usersNotDeleted, u)
|
||||
}
|
||||
}
|
||||
|
||||
// Sort our non deleted members by username
|
||||
sort.Slice(usersNotDeleted, func(i, j int) bool {
|
||||
return usersNotDeleted[i].Username < usersNotDeleted[j].Username
|
||||
})
|
||||
|
||||
require.Equal(t, len(usersNotDeleted), len(members))
|
||||
for i, member := range members {
|
||||
assert.Equal(t, usersNotDeleted[i].Id, member.UserId)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("Ensure Sorted By User ID when no TeamMemberGetOptions is passed", func(t *testing.T) {
|
||||
|
||||
// Sort them by UserID because the result of GetTeamMembers() is also sorted
|
||||
sort.Slice(users, func(i, j int) bool {
|
||||
return users[i].Id < users[j].Id
|
||||
})
|
||||
|
||||
// Fetch team members multipile times
|
||||
members, err := th.App.GetTeamMembers(th.BasicTeam.Id, 0, 5, nil)
|
||||
require.Nil(t, err)
|
||||
|
||||
// This should return 5 members
|
||||
members2, err := th.App.GetTeamMembers(th.BasicTeam.Id, 5, 6, nil)
|
||||
require.Nil(t, err)
|
||||
members = append(members, members2...)
|
||||
|
||||
require.Equal(t, len(users), len(members))
|
||||
for i, member := range members {
|
||||
assert.Equal(t, users[i].Id, member.UserId)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestGetTeamStats(t *testing.T) {
|
||||
|
||||
@@ -1007,7 +1007,10 @@ func TestResctrictedViewMembers(t *testing.T) {
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.Name, func(t *testing.T) {
|
||||
results, err := th.App.GetTeamMembers(tc.TeamId, 0, 100, tc.Restrictions)
|
||||
getTeamMemberOptions := &model.TeamMembersGetOptions{
|
||||
ViewRestrictions: tc.Restrictions,
|
||||
}
|
||||
results, err := th.App.GetTeamMembers(tc.TeamId, 0, 100, getTeamMemberOptions)
|
||||
require.Nil(t, err)
|
||||
ids := []string{}
|
||||
for _, result := range results {
|
||||
|
||||
Ссылка в новой задаче
Block a user