diff --git a/controllers/group.go b/controllers/group.go index af4e543e..6fedaeea 100644 --- a/controllers/group.go +++ b/controllers/group.go @@ -70,15 +70,33 @@ func (c *ApiController) GetGroups() { if err != nil { c.ResponseError(err.Error()) return - } else { - err = object.ExtendGroupsWithUsers(groups) - if err != nil { - c.ResponseError(err.Error()) - return + } + groupsHaveChildrenMap, err := object.GetGroupsHaveChildrenMap(groups) + if err != nil { + c.ResponseError(err.Error()) + return + } + + for _, group := range groups { + _, ok := groupsHaveChildrenMap[group.Name] + if ok { + group.HaveChildren = true } - c.ResponseOk(groups, paginator.Nums()) + parent, ok := groupsHaveChildrenMap[group.ParentId] + if ok { + group.ParentName = parent.DisplayName + } } + + err = object.ExtendGroupsWithUsers(groups) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.ResponseOk(groups, paginator.Nums()) + } } diff --git a/object/group.go b/object/group.go index 35f7cdde..910d17ea 100644 --- a/object/group.go +++ b/object/group.go @@ -17,7 +17,6 @@ package object import ( "errors" "fmt" - "sync" "github.com/casdoor/casdoor/conf" "github.com/casdoor/casdoor/util" @@ -36,12 +35,14 @@ type Group struct { ContactEmail string `xorm:"varchar(100)" json:"contactEmail"` Type string `xorm:"varchar(100)" json:"type"` ParentId string `xorm:"varchar(100)" json:"parentId"` + ParentName string `xorm:"-" json:"parentName"` IsTopGroup bool `xorm:"bool" json:"isTopGroup"` Users []string `xorm:"-" json:"users"` - Title string `json:"title,omitempty"` - Key string `json:"key,omitempty"` - Children []*Group `json:"children,omitempty"` + Title string `json:"title,omitempty"` + Key string `json:"key,omitempty"` + HaveChildren bool `xorm:"-" json:"haveChildren"` + Children []*Group `json:"children,omitempty"` IsEnabled bool `json:"isEnabled"` } @@ -79,6 +80,26 @@ func GetPaginationGroups(owner string, offset, limit int, field, value, sortFiel return groups, nil } +func GetGroupsHaveChildrenMap(groups []*Group) (map[string]*Group, error) { + groupsHaveChildren := []*Group{} + resultMap := make(map[string]*Group) + + groupIds := []string{} + for _, group := range groups { + groupIds = append(groupIds, group.Name) + groupIds = append(groupIds, group.ParentId) + } + + err := ormer.Engine.Cols("owner", "name", "parent_id", "display_name").Distinct("parent_id").In("parent_id", groupIds).Find(&groupsHaveChildren) + if err != nil { + return nil, err + } + for _, group := range groups { + resultMap[group.Name] = group + } + return resultMap, nil +} + func getGroup(owner string, name string) (*Group, error) { if owner == "" || name == "" { return nil, nil @@ -298,17 +319,11 @@ func ExtendGroupWithUsers(group *Group) error { return nil } - users, err := GetUsers(group.Owner) - if err != nil { - return err - } - groupId := group.GetId() userIds := []string{} - for _, user := range users { - if util.InSlice(user.Groups, groupId) { - userIds = append(userIds, user.GetId()) - } + userIds, err := userEnforcer.GetAllUsersByGroup(groupId) + if err != nil { + return err } group.Users = userIds @@ -316,29 +331,14 @@ func ExtendGroupWithUsers(group *Group) error { } func ExtendGroupsWithUsers(groups []*Group) error { - var wg sync.WaitGroup - errChan := make(chan error, len(groups)) - for _, group := range groups { - wg.Add(1) - go func(group *Group) { - defer wg.Done() - err := ExtendGroupWithUsers(group) - if err != nil { - errChan <- err - } - }(group) - } - - wg.Wait() - close(errChan) - - for err := range errChan { + users, err := userEnforcer.GetAllUsersByGroup(group.GetId()) if err != nil { return err } - } + group.Users = users + } return nil } diff --git a/web/src/GroupListPage.js b/web/src/GroupListPage.js index 47eac6f3..451b25db 100644 --- a/web/src/GroupListPage.js +++ b/web/src/GroupListPage.js @@ -33,18 +33,6 @@ class GroupListPage extends BaseListPage { } UNSAFE_componentWillMount() { super.UNSAFE_componentWillMount(); - this.getGroups(this.state.owner); - } - - getGroups(organizationName) { - GroupBackend.getGroups(organizationName) - .then((res) => { - if (res.status === "ok") { - this.setState({ - groups: res.data, - }); - } - }); } newGroup() { @@ -188,12 +176,8 @@ class GroupListPage extends BaseListPage { {record.parentId} ; } - const parentGroup = this.state.groups.find((group) => group.name === text); - if (parentGroup === undefined) { - return ""; - } - return - {parentGroup?.displayName} + return + {record?.parentName} ; }, }, @@ -215,12 +199,11 @@ class GroupListPage extends BaseListPage { width: "180px", fixed: (Setting.isMobile()) ? "false" : "right", render: (text, record, index) => { - const haveChildren = this.state.groups.find((group) => group.parentId === record.id) !== undefined; return (
this.deleteGroup(index)} >