From c0d8a7132e38a4a1ff5cc9cfbfb56b96526b0506 Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Mon, 6 Nov 2023 17:08:11 +0100 Subject: [PATCH] Teams: Search by team ids (#77730) * Teams: Search by team ids * Add tests * Fix tests --- pkg/services/team/model.go | 1 + pkg/services/team/teamapi/team.go | 10 ++++++++++ pkg/services/team/teamimpl/store.go | 7 +++++++ pkg/services/team/teamimpl/store_test.go | 20 ++++++++++++++++++++ 4 files changed, 38 insertions(+) diff --git a/pkg/services/team/model.go b/pkg/services/team/model.go index 3ab72eace9a..63cfcce3ba5 100644 --- a/pkg/services/team/model.go +++ b/pkg/services/team/model.go @@ -92,6 +92,7 @@ type SearchTeamsQuery struct { Page int OrgID int64 `xorm:"org_id"` SortOpts []model.SortOption + TeamIds []int64 SignedInUser identity.Requester HiddenUsers map[string]struct{} } diff --git a/pkg/services/team/teamapi/team.go b/pkg/services/team/teamapi/team.go index ebcde9222d9..ab4b8b33c09 100644 --- a/pkg/services/team/teamapi/team.go +++ b/pkg/services/team/teamapi/team.go @@ -154,10 +154,20 @@ func (tapi *TeamAPI) searchTeams(c *contextmodel.ReqContext) response.Response { return response.Err(err) } + stringTeamIDs := c.QueryStrings("teamId") + queryTeamIDs := make([]int64, 0) + for _, id := range stringTeamIDs { + teamID, err := strconv.ParseInt(id, 10, 64) + if err == nil { + queryTeamIDs = append(queryTeamIDs, teamID) + } + } + query := team.SearchTeamsQuery{ OrgID: c.SignedInUser.GetOrgID(), Query: c.Query("query"), Name: c.Query("name"), + TeamIds: queryTeamIDs, Page: page, Limit: perPage, SignedInUser: c.SignedInUser, diff --git a/pkg/services/team/teamimpl/store.go b/pkg/services/team/teamimpl/store.go index c600ecfb443..b91da0f3a50 100644 --- a/pkg/services/team/teamimpl/store.go +++ b/pkg/services/team/teamimpl/store.go @@ -212,6 +212,13 @@ func (ss *xormStore) Search(ctx context.Context, query *team.SearchTeamsQuery) ( params = append(params, query.Name) } + if len(query.TeamIds) > 0 { + sql.WriteString(` and team.id IN (?` + strings.Repeat(",?", len(query.TeamIds)-1) + ")") + for _, id := range query.TeamIds { + params = append(params, id) + } + } + acFilter, err := ac.Filter(query.SignedInUser, "team.id", "teams:id:", ac.ActionTeamsRead) if err != nil { return err diff --git a/pkg/services/team/teamimpl/store_test.go b/pkg/services/team/teamimpl/store_test.go index 67d09377717..78d91645bd5 100644 --- a/pkg/services/team/teamimpl/store_test.go +++ b/pkg/services/team/teamimpl/store_test.go @@ -268,6 +268,26 @@ func TestIntegrationTeamCommandsAndQueries(t *testing.T) { require.Equal(t, queryResult.Teams[1].Name, team1.Name) }) + t.Run("Should be able to query teams by ids", func(t *testing.T) { + allTeamsQuery := &team.SearchTeamsQuery{OrgID: testOrgID, Query: "", SignedInUser: testUser} + allTeamsQueryResult, err := teamSvc.SearchTeams(context.Background(), allTeamsQuery) + require.NoError(t, err) + require.Equal(t, len(allTeamsQueryResult.Teams), 2) + + teamIds := make([]int64, 0) + for _, team := range allTeamsQueryResult.Teams { + teamIds = append(teamIds, team.ID) + } + + query := &team.SearchTeamsQuery{OrgID: testOrgID, SignedInUser: testUser, TeamIds: teamIds} + queryResult, err := teamSvc.SearchTeams(context.Background(), query) + require.NoError(t, err) + require.Equal(t, len(queryResult.Teams), 2) + require.EqualValues(t, queryResult.TotalCount, 2) + require.Equal(t, queryResult.Teams[0].ID, teamIds[0]) + require.Equal(t, queryResult.Teams[1].ID, teamIds[1]) + }) + t.Run("Should be able to return all teams a user is member of", func(t *testing.T) { sqlStore = db.InitTestDB(t) setup()