diff options
author | zeripath <art27@cantab.net> | 2021-09-01 06:31:42 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-01 01:31:42 -0400 |
commit | 57b0887ab21aaee9a70638df70f6dec0f72098c4 (patch) | |
tree | b2034c61fe70b6ba8da68ff6a0db80bdba3a17cd /models | |
parent | 83640a595b99c7e19133e649359a6f3d8133ca4c (diff) | |
download | gitea-57b0887ab21aaee9a70638df70f6dec0f72098c4.tar.gz gitea-57b0887ab21aaee9a70638df70f6dec0f72098c4.zip |
Correctly return the number of Repositories for Organizations (#16807)
Calculate and return the number of Repositories on the dashboard
Organization list.
This PR restores some of the logic that was removed in #14032 to
calculate the number of repos on the dashboard orgs list.
Fix #16648
Replaces #16799
Signed-off-by: Andrew Thornton <art27@cantab.net>
Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: techknowlogick <techknowlogick@gitea.io>
Diffstat (limited to 'models')
-rw-r--r-- | models/org.go | 68 |
1 files changed, 56 insertions, 12 deletions
diff --git a/models/org.go b/models/org.go index 3de6bd14b2..9540c4240e 100644 --- a/models/org.go +++ b/models/org.go @@ -421,23 +421,67 @@ func GetOrgsByUserID(userID int64, showAll bool) ([]*User, error) { return getOrgsByUserID(sess, userID, showAll) } -// queryUserOrgIDs returns a condition to return user's organization id -func queryUserOrgIDs(uid int64) *builder.Builder { - return builder.Select("team.org_id"). - From("team_user").InnerJoin("team", "team.id = team_user.team_id"). - Where(builder.Eq{"team_user.uid": uid}) -} - // MinimalOrg represents a simple orgnization with only needed columns type MinimalOrg = User // GetUserOrgsList returns one user's all orgs list -func GetUserOrgsList(uid int64) ([]*MinimalOrg, error) { - var orgs = make([]*MinimalOrg, 0, 20) - return orgs, x.Select("id, name, full_name, visibility, avatar, avatar_email, use_custom_avatar"). +func GetUserOrgsList(user *User) ([]*MinimalOrg, error) { + sess := x.NewSession() + defer sess.Close() + + schema, err := x.TableInfo(new(User)) + if err != nil { + return nil, err + } + + outputCols := []string{ + "id", + "name", + "full_name", + "visibility", + "avatar", + "avatar_email", + "use_custom_avatar", + } + + groupByCols := &strings.Builder{} + for _, col := range outputCols { + fmt.Fprintf(groupByCols, "`%s`.%s,", schema.Name, col) + } + groupByStr := groupByCols.String() + groupByStr = groupByStr[0 : len(groupByStr)-1] + + sess.Select(groupByStr+", count(repo_id) as org_count"). Table("user"). - In("id", queryUserOrgIDs(uid)). - Find(&orgs) + Join("INNER", "team", "`team`.org_id = `user`.id"). + Join("INNER", "team_user", "`team`.id = `team_user`.team_id"). + Join("LEFT", builder. + Select("id as repo_id, owner_id as repo_owner_id"). + From("repository"). + Where(accessibleRepositoryCondition(user)), "`repository`.repo_owner_id = `team`.org_id"). + Where("`team_user`.uid = ?", user.ID). + GroupBy(groupByStr) + + type OrgCount struct { + User `xorm:"extends"` + OrgCount int + } + + orgCounts := make([]*OrgCount, 0, 10) + + if err := sess. + Asc("`user`.name"). + Find(&orgCounts); err != nil { + return nil, err + } + + orgs := make([]*MinimalOrg, len(orgCounts)) + for i, orgCount := range orgCounts { + orgCount.User.NumRepos = orgCount.OrgCount + orgs[i] = &orgCount.User + } + + return orgs, nil } func getOwnedOrgsByUserID(sess *xorm.Session, userID int64) ([]*User, error) { |