Просмотр исходного кода

teams: add team count when searching for team

closes #10207
bergquist 8 лет назад
Родитель
Сommit
256f7176a2

+ 1 - 1
pkg/api/team_test.go

@@ -13,7 +13,7 @@ import (
 func TestTeamApiEndpoint(t *testing.T) {
 	Convey("Given two teams", t, func() {
 		mockResult := models.SearchTeamQueryResult{
-			Teams: []*models.Team{
+			Teams: []*models.SearchTeamDto{
 				{Name: "team1"},
 				{Name: "team2"},
 			},

+ 11 - 4
pkg/models/team.go

@@ -60,9 +60,16 @@ type SearchTeamsQuery struct {
 	Result SearchTeamQueryResult
 }
 
+type SearchTeamDto struct {
+	Id          int64  `json:"id"`
+	OrgId       int64  `json:"orgId"`
+	Name        string `json:"name"`
+	MemberCount int64  `json:"memberCount"`
+}
+
 type SearchTeamQueryResult struct {
-	TotalCount int64   `json:"totalCount"`
-	Teams      []*Team `json:"teams"`
-	Page       int     `json:"page"`
-	PerPage    int     `json:"perPage"`
+	TotalCount int64            `json:"totalCount"`
+	Teams      []*SearchTeamDto `json:"teams"`
+	Page       int              `json:"page"`
+	PerPage    int              `json:"perPage"`
 }

+ 30 - 12
pkg/services/sqlstore/team.go

@@ -1,6 +1,7 @@
 package sqlstore
 
 import (
+	"bytes"
 	"fmt"
 	"time"
 
@@ -114,37 +115,54 @@ func isTeamNameTaken(name string, existingId int64, sess *DBSession) (bool, erro
 
 func SearchTeams(query *m.SearchTeamsQuery) error {
 	query.Result = m.SearchTeamQueryResult{
-		Teams: make([]*m.Team, 0),
+		Teams: make([]*m.SearchTeamDto, 0),
 	}
 	queryWithWildcards := "%" + query.Query + "%"
 
-	sess := x.Table("team")
-	sess.Where("org_id=?", query.OrgId)
+	var sql bytes.Buffer
+	params := make([]interface{}, 0)
+
+	sql.WriteString(`select
+		team.id as id,
+		team.name as name,
+		(select count(*) from team_member where team_member.team_id = team.id) as member_count
+		from team as team
+		where team.org_id = ?`)
+
+	params = append(params, query.OrgId)
 
 	if query.Query != "" {
-		sess.Where("name LIKE ?", queryWithWildcards)
+		sql.WriteString(` and team.name ` + dialect.LikeStr() + ` ?`)
+		params = append(params, queryWithWildcards)
 	}
+
 	if query.Name != "" {
-		sess.Where("name=?", query.Name)
+		sql.WriteString(` and team.name = ?`)
+		params = append(params, query.Name)
+	}
+
+	sql.WriteString(` order by team.name asc`)
+
+	if query.Limit != 0 {
+		sql.WriteString(` limit ? offset ?`)
+		offset := query.Limit * (query.Page - 1)
+		params = append(params, query.Limit, offset)
 	}
-	sess.Asc("name")
 
-	offset := query.Limit * (query.Page - 1)
-	sess.Limit(query.Limit, offset)
-	sess.Cols("id", "name")
-	if err := sess.Find(&query.Result.Teams); err != nil {
+	if err := x.Sql(sql.String(), params...).Find(&query.Result.Teams); err != nil {
 		return err
 	}
 
 	team := m.Team{}
-
 	countSess := x.Table("team")
 	if query.Query != "" {
-		countSess.Where("name LIKE ?", queryWithWildcards)
+		countSess.Where(`name `+dialect.LikeStr()+` ?`, queryWithWildcards)
 	}
+
 	if query.Name != "" {
 		countSess.Where("name=?", query.Name)
 	}
+
 	count, err := countSess.Count(&team)
 	query.Result.TotalCount = count
 

+ 1 - 1
public/app/features/org/partials/teams.html

@@ -28,7 +28,7 @@
           <td>
             <a href="org/teams/edit/{{team.id}}">{{team.name}}</a>
           </td>
-          <td>#Count</td>
+          <td>{{team.memberCount}}</td>
           <td class="text-right">
             <a href="org/teams/edit/{{team.id}}" class="btn btn-inverse btn-small">
               <i class="fa fa-edit"></i>