MM-16258: Adds new API endpoint + (App & Client & Store) to retrieve … (#11176)
* MM-16258: Adds new API endpoint + (App & Client & Store) to retrieve Users who would be removed from a list of hypothetical group IDs representing the synced groups. * MM-16258: Adds roles to JSON response. * MM-16258: Updates GetByIDs to use Squirrel. * MM-16258: Puts as much as possible into Squirrel. * MM-16258: Changes names of methods, functions, and route. * MM-16258: Updates some comments. * MM-16258: Extra validation of group_ids parameter. * MM-16258: Changes validation of group_ids query param. * MM-16258: Rename a variable and a constant. * MM-16258: Fix test.
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
5ee1f6e2e0
Коммит
9d41c7a583
61
app/group.go
61
app/group.go
@@ -4,6 +4,8 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/mattermost/mattermost-server/model"
|
||||
)
|
||||
|
||||
@@ -160,3 +162,62 @@ func (a *App) GetGroupsByTeam(teamId string, opts model.GroupSearchOpts) ([]*mod
|
||||
func (a *App) GetGroups(page, perPage int, opts model.GroupSearchOpts) ([]*model.Group, *model.AppError) {
|
||||
return a.Srv.Store.Group().GetGroups(page, perPage, opts)
|
||||
}
|
||||
|
||||
// TeamMembersMinusGroupMembers returns the set of users on the given team minus the set of users in the given
|
||||
// groups.
|
||||
//
|
||||
// The result can be used, for example, to determine the set of users who would be removed from a team if the team
|
||||
// were group-constrained with the given groups.
|
||||
func (a *App) TeamMembersMinusGroupMembers(teamID string, groupIDs []string, page, perPage int) ([]*model.UserWithGroups, int64, *model.AppError) {
|
||||
users, err := a.Srv.Store.Group().TeamMembersMinusGroupMembers(teamID, groupIDs, page, perPage)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
// parse all group ids of all users
|
||||
allUsersGroupIDMap := map[string]bool{}
|
||||
for _, user := range users {
|
||||
for _, groupID := range strings.Split(user.GroupIDs, ",") {
|
||||
allUsersGroupIDMap[groupID] = true
|
||||
}
|
||||
}
|
||||
|
||||
// create a slice of distinct group ids
|
||||
var allUsersGroupIDSlice []string
|
||||
for key := range allUsersGroupIDMap {
|
||||
allUsersGroupIDSlice = append(allUsersGroupIDSlice, key)
|
||||
}
|
||||
|
||||
// retrieve groups from DB
|
||||
groups, err := a.GetGroupsByIDs(allUsersGroupIDSlice)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
// map groups by id
|
||||
groupMap := map[string]*model.Group{}
|
||||
for _, group := range groups {
|
||||
groupMap[group.Id] = group
|
||||
}
|
||||
|
||||
// populate each instance's groups field
|
||||
for _, user := range users {
|
||||
user.Groups = []*model.Group{}
|
||||
for _, groupID := range strings.Split(user.GroupIDs, ",") {
|
||||
group, ok := groupMap[groupID]
|
||||
if ok {
|
||||
user.Groups = append(user.Groups, group)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
totalCount, err := a.Srv.Store.Group().CountTeamMembersMinusGroupMembers(teamID, groupIDs)
|
||||
if err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
return users, totalCount, nil
|
||||
}
|
||||
|
||||
func (a *App) GetGroupsByIDs(groupIDs []string) ([]*model.Group, *model.AppError) {
|
||||
return a.Srv.Store.Group().GetByIDs(groupIDs)
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user