Backport #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>
This commit is contained in:
		
							parent
							
								
									cbe3ca5d0b
								
							
						
					
					
						commit
						f949f9e9c5
					
				
					 2 changed files with 57 additions and 13 deletions
				
			
		|  | @ -425,23 +425,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