Pārlūkot izejas kodu

Add org.getUserTeams to reduce redundant code

Unknwon 8 gadi atpakaļ
vecāks
revīzija
a562228c5e
2 mainītis faili ar 31 papildinājumiem un 33 dzēšanām
  1. 29 32
      models/org.go
  2. 2 1
      modules/context/org.go

+ 29 - 32
models/org.go

@@ -445,34 +445,46 @@ func RemoveOrgRepo(orgID, repoID int64) error {
 	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.
-// It returns [-1] if user is not memeber of any teams.
 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))
 	for i := range teams {
 		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
 }
 
-// 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) {
 	teamIDs, err := org.GetUserTeamIDs(userID)
 	if err != nil {
 		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 {
 		page = 1
@@ -513,35 +525,20 @@ func (org *User) GetUserMirrorRepositories(userID int64) ([]*Repository, error)
 	if err != nil {
 		return nil, fmt.Errorf("GetUserTeamIDs: %v", err)
 	}
+	if len(teamIDs) == 0 {
+		teamIDs = []int64{-1}
+	}
 
 	repos := make([]*Repository, 0, 10)
 	if err = x.Sql(fmt.Sprintf(`SELECT repository.* FROM repository
 	INNER JOIN team_repo 
 	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)
-	GROUP BY repository.id`,
+	GROUP BY repository.id
+	ORDER BY updated_unix DESC`,
 		strings.Join(base.Int64sToStrings(teamIDs), ",")),
 		true, org.ID, false).Find(&repos); err != nil {
 		return nil, fmt.Errorf("get repositories: %v", err)
 	}
 	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
-}

+ 2 - 1
modules/context/org.go

@@ -105,7 +105,8 @@ func HandleOrgAssignment(ctx *Context, args ...bool) {
 				return
 			}
 		} else {
-			if err := org.GetUserTeams(ctx.User.ID); err != nil {
+			org.Teams, err = org.GetUserTeams(ctx.User.ID)
+			if err != nil {
 				ctx.Handle(500, "GetUserTeams", err)
 				return
 			}