|  | @@ -445,34 +445,46 @@ func RemoveOrgRepo(orgID, repoID int64) error {
 | 
											
												
													
														|  |  	return removeOrgRepo(x, orgID, repoID)
 |  |  	return removeOrgRepo(x, orgID, repoID)
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +func (org *User) getUserTeams(e Engine, userID int64, cols ...string) ([]*Team, error) {
 | 
											
												
													
														|  | 
 |  | +	teams := make([]*Team, 0, org.NumTeams)
 | 
											
												
													
														|  | 
 |  | +	return teams, e.Where("team_user.org_id = ?", org.ID).
 | 
											
												
													
														|  | 
 |  | +		And("team_user.uid = ?", userID).
 | 
											
												
													
														|  | 
 |  | +		Join("INNER", "team_user", "team_user.team_id = team.id").
 | 
											
												
													
														|  | 
 |  | +		Cols(cols...).Find(&teams)
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  // GetUserTeamIDs returns of all team IDs of the organization that user is memeber of.
 |  |  // GetUserTeamIDs returns of all team IDs of the organization that user is memeber of.
 | 
											
												
													
														|  | -// It returns [-1] if user is not memeber of any teams.
 |  | 
 | 
											
												
													
														|  |  func (org *User) GetUserTeamIDs(userID int64) ([]int64, error) {
 |  |  func (org *User) GetUserTeamIDs(userID int64) ([]int64, error) {
 | 
											
												
													
														|  | -	teams := make([]*Team, 0, org.NumTeams)
 |  | 
 | 
											
												
													
														|  | -	if err := x.Sql(`SELECT team.id FROM team
 |  | 
 | 
											
												
													
														|  | -	INNER JOIN team_user ON team_user.team_id = team.id
 |  | 
 | 
											
												
													
														|  | -	WHERE team_user.org_id = ? AND team_user.uid = ?`, org.ID, userID).Find(&teams); err != nil {
 |  | 
 | 
											
												
													
														|  | -		return nil, err
 |  | 
 | 
											
												
													
														|  | 
 |  | +	teams, err := org.getUserTeams(x, userID, "team.id")
 | 
											
												
													
														|  | 
 |  | +	if err != nil {
 | 
											
												
													
														|  | 
 |  | +		return nil, fmt.Errorf("getUserTeams [%d]: %v", userID, err)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	teamIDs := make([]int64, len(teams))
 |  |  	teamIDs := make([]int64, len(teams))
 | 
											
												
													
														|  |  	for i := range teams {
 |  |  	for i := range teams {
 | 
											
												
													
														|  |  		teamIDs[i] = teams[i].ID
 |  |  		teamIDs[i] = teams[i].ID
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  | -	if len(teamIDs) == 0 {
 |  | 
 | 
											
												
													
														|  | -		// user has no team but "IN ()" is invalid SQL
 |  | 
 | 
											
												
													
														|  | -		teamIDs = append(teamIDs, -1) // there is no repo with id=-1
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  |  	return teamIDs, nil
 |  |  	return teamIDs, nil
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -// GetUserRepositories returns repositories of the organization
 |  | 
 | 
											
												
													
														|  | -// that the user with the given userID has access to.
 |  | 
 | 
											
												
													
														|  | 
 |  | +// GetTeams returns all teams that belong to organization,
 | 
											
												
													
														|  | 
 |  | +// and that the user has joined.
 | 
											
												
													
														|  | 
 |  | +func (org *User) GetUserTeams(userID int64) ([]*Team, error) {
 | 
											
												
													
														|  | 
 |  | +	return org.getUserTeams(x, userID)
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +// GetUserRepositories returns a range of repositories in organization
 | 
											
												
													
														|  | 
 |  | +// that the user with the given userID has access to,
 | 
											
												
													
														|  | 
 |  | +// and total number of records based on given condition.
 | 
											
												
													
														|  |  func (org *User) GetUserRepositories(userID int64, page, pageSize int) ([]*Repository, int64, error) {
 |  |  func (org *User) GetUserRepositories(userID int64, page, pageSize int) ([]*Repository, int64, error) {
 | 
											
												
													
														|  |  	teamIDs, err := org.GetUserTeamIDs(userID)
 |  |  	teamIDs, err := org.GetUserTeamIDs(userID)
 | 
											
												
													
														|  |  	if err != nil {
 |  |  	if err != nil {
 | 
											
												
													
														|  |  		return nil, 0, fmt.Errorf("GetUserTeamIDs: %v", err)
 |  |  		return nil, 0, fmt.Errorf("GetUserTeamIDs: %v", err)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  | 
 |  | +	if len(teamIDs) == 0 {
 | 
											
												
													
														|  | 
 |  | +		// user has no team but "IN ()" is invalid SQL
 | 
											
												
													
														|  | 
 |  | +		teamIDs = []int64{-1} // there is no repo with id=-1
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	if page <= 0 {
 |  |  	if page <= 0 {
 | 
											
												
													
														|  |  		page = 1
 |  |  		page = 1
 | 
											
										
											
												
													
														|  | @@ -513,35 +525,20 @@ func (org *User) GetUserMirrorRepositories(userID int64) ([]*Repository, error)
 | 
											
												
													
														|  |  	if err != nil {
 |  |  	if err != nil {
 | 
											
												
													
														|  |  		return nil, fmt.Errorf("GetUserTeamIDs: %v", err)
 |  |  		return nil, fmt.Errorf("GetUserTeamIDs: %v", err)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  | 
 |  | +	if len(teamIDs) == 0 {
 | 
											
												
													
														|  | 
 |  | +		teamIDs = []int64{-1}
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	repos := make([]*Repository, 0, 10)
 |  |  	repos := make([]*Repository, 0, 10)
 | 
											
												
													
														|  |  	if err = x.Sql(fmt.Sprintf(`SELECT repository.* FROM repository
 |  |  	if err = x.Sql(fmt.Sprintf(`SELECT repository.* FROM repository
 | 
											
												
													
														|  |  	INNER JOIN team_repo 
 |  |  	INNER JOIN team_repo 
 | 
											
												
													
														|  |  	ON team_repo.repo_id = repository.id AND repository.is_mirror = ?
 |  |  	ON team_repo.repo_id = repository.id AND repository.is_mirror = ?
 | 
											
												
													
														|  |  	WHERE (repository.owner_id = ? AND repository.is_private = ?) OR team_repo.team_id IN (%s)
 |  |  	WHERE (repository.owner_id = ? AND repository.is_private = ?) OR team_repo.team_id IN (%s)
 | 
											
												
													
														|  | -	GROUP BY repository.id`,
 |  | 
 | 
											
												
													
														|  | 
 |  | +	GROUP BY repository.id
 | 
											
												
													
														|  | 
 |  | +	ORDER BY updated_unix DESC`,
 | 
											
												
													
														|  |  		strings.Join(base.Int64sToStrings(teamIDs), ",")),
 |  |  		strings.Join(base.Int64sToStrings(teamIDs), ",")),
 | 
											
												
													
														|  |  		true, org.ID, false).Find(&repos); err != nil {
 |  |  		true, org.ID, false).Find(&repos); err != nil {
 | 
											
												
													
														|  |  		return nil, fmt.Errorf("get repositories: %v", err)
 |  |  		return nil, fmt.Errorf("get repositories: %v", err)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  	return repos, nil
 |  |  	return repos, nil
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -// GetTeams returns all teams that belong to organization,
 |  | 
 | 
											
												
													
														|  | -// and that the user has joined.
 |  | 
 | 
											
												
													
														|  | -func (org *User) GetUserTeams(userID int64) error {
 |  | 
 | 
											
												
													
														|  | -	teams := make([]*Team, 0, 5)
 |  | 
 | 
											
												
													
														|  | -	if err := x.Sql(`SELECT team.* FROM team
 |  | 
 | 
											
												
													
														|  | -INNER JOIN team_user ON team_user.team_id = team.id
 |  | 
 | 
											
												
													
														|  | -WHERE team_user.org_id = ? AND team_user.uid = ?`,
 |  | 
 | 
											
												
													
														|  | -		org.ID, userID).Find(&teams); err != nil {
 |  | 
 | 
											
												
													
														|  | -		return fmt.Errorf("get teams: %v", err)
 |  | 
 | 
											
												
													
														|  | -	}
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	org.Teams = teams
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	// FIXME: should I change this value inside method,
 |  | 
 | 
											
												
													
														|  | -	// or only in location of caller where it's really needed?
 |  | 
 | 
											
												
													
														|  | -	org.NumTeams = len(org.Teams)
 |  | 
 | 
											
												
													
														|  | -	return nil
 |  | 
 | 
											
												
													
														|  | -}
 |  | 
 |