diff options
Diffstat (limited to 'models/user.go')
-rw-r--r-- | models/user.go | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/models/user.go b/models/user.go index a89eb144ce..01cce2506d 100644 --- a/models/user.go +++ b/models/user.go @@ -712,18 +712,52 @@ func (u *User) GetOwnedOrganizations() (err error) { // GetOrganizations returns paginated organizations that user belongs to. func (u *User) GetOrganizations(opts *SearchOrganizationsOptions) error { - ous, err := GetOrgUsersByUserID(u.ID, opts) + sess := x.NewSession() + defer sess.Close() + + schema, err := x.TableInfo(new(User)) if err != nil { return err } + groupByCols := &strings.Builder{} + for _, col := range schema.Columns() { + fmt.Fprintf(groupByCols, "`%s`.%s,", schema.Name, col.Name) + } + groupByStr := groupByCols.String() + groupByStr = groupByStr[0 : len(groupByStr)-1] - u.Orgs = make([]*User, len(ous)) - for i, ou := range ous { - u.Orgs[i], err = GetUserByID(ou.OrgID) - if err != nil { - return err - } + sess.Select("`user`.*, count(repo_id) as org_count"). + Table("user"). + Join("INNER", "org_user", "`org_user`.org_id=`user`.id"). + Join("LEFT", builder. + Select("id as repo_id, owner_id as repo_owner_id"). + From("repository"). + Where(accessibleRepositoryCondition(u)), "`repository`.repo_owner_id = `org_user`.org_id"). + And("`org_user`.uid=?", u.ID). + GroupBy(groupByStr) + if opts.PageSize != 0 { + sess = opts.setSessionPagination(sess) } + type OrgCount struct { + User `xorm:"extends"` + OrgCount int + } + orgCounts := make([]*OrgCount, 0, 10) + + if err := sess. + Asc("`user`.name"). + Find(&orgCounts); err != nil { + return err + } + + orgs := make([]*User, len(orgCounts)) + for i, orgCount := range orgCounts { + orgCount.User.NumRepos = orgCount.OrgCount + orgs[i] = &orgCount.User + } + + u.Orgs = orgs + return nil } |