mirror of
https://github.com/go-gitea/gitea
synced 2024-12-22 09:44:16 +01:00
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>
This commit is contained in:
parent
83640a595b
commit
57b0887ab2
2 changed files with 57 additions and 13 deletions
|
@ -421,23 +421,67 @@ func GetOrgsByUserID(userID int64, showAll bool) ([]*User, error) {
|
||||||
return getOrgsByUserID(sess, userID, showAll)
|
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
|
// MinimalOrg represents a simple orgnization with only needed columns
|
||||||
type MinimalOrg = User
|
type MinimalOrg = User
|
||||||
|
|
||||||
// GetUserOrgsList returns one user's all orgs list
|
// GetUserOrgsList returns one user's all orgs list
|
||||||
func GetUserOrgsList(uid int64) ([]*MinimalOrg, error) {
|
func GetUserOrgsList(user *User) ([]*MinimalOrg, error) {
|
||||||
var orgs = make([]*MinimalOrg, 0, 20)
|
sess := x.NewSession()
|
||||||
return orgs, x.Select("id, name, full_name, visibility, avatar, avatar_email, use_custom_avatar").
|
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").
|
Table("user").
|
||||||
In("id", queryUserOrgIDs(uid)).
|
Join("INNER", "team", "`team`.org_id = `user`.id").
|
||||||
Find(&orgs)
|
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) {
|
func getOwnedOrgsByUserID(sess *xorm.Session, userID int64) ([]*User, error) {
|
||||||
|
|
|
@ -49,7 +49,7 @@ func getDashboardContextUser(ctx *context.Context) *models.User {
|
||||||
}
|
}
|
||||||
ctx.Data["ContextUser"] = ctxUser
|
ctx.Data["ContextUser"] = ctxUser
|
||||||
|
|
||||||
orgs, err := models.GetUserOrgsList(ctx.User.ID)
|
orgs, err := models.GetUserOrgsList(ctx.User)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.ServerError("GetUserOrgsList", err)
|
ctx.ServerError("GetUserOrgsList", err)
|
||||||
return nil
|
return nil
|
||||||
|
|
Loading…
Reference in a new issue