Skip to content

Commit

Permalink
Correctly return the number of Repositories for Organizations
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
zeripath committed Aug 24, 2021
1 parent d22cb60 commit 181c391
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 13 deletions.
68 changes: 56 additions & 12 deletions models/org.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion routers/web/user/home.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ func getDashboardContextUser(ctx *context.Context) *models.User {
}
ctx.Data["ContextUser"] = ctxUser

orgs, err := models.GetUserOrgsList(ctx.User.ID)
orgs, err := models.GetUserOrgsList(ctx.User)
if err != nil {
ctx.ServerError("GetUserOrgsList", err)
return nil
Expand Down

0 comments on commit 181c391

Please sign in to comment.