summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api4/team.go19
-rw-r--r--api4/team_test.go48
-rw-r--r--app/team.go16
-rw-r--r--model/client4.go11
-rw-r--r--store/sql_team_store.go58
-rw-r--r--store/store.go2
6 files changed, 154 insertions, 0 deletions
diff --git a/api4/team.go b/api4/team.go
index db42dc6b6..9071458cb 100644
--- a/api4/team.go
+++ b/api4/team.go
@@ -16,6 +16,7 @@ func InitTeam() {
l4g.Debug(utils.T("api.team.init.debug"))
BaseRoutes.Teams.Handle("", ApiSessionRequired(createTeam)).Methods("POST")
+ BaseRoutes.Teams.Handle("", ApiSessionRequired(getAllTeams)).Methods("GET")
BaseRoutes.TeamsForUser.Handle("", ApiSessionRequired(getTeamsForUser)).Methods("GET")
BaseRoutes.Team.Handle("", ApiSessionRequired(getTeam)).Methods("GET")
@@ -189,3 +190,21 @@ func updateTeamMemberRoles(c *Context, w http.ResponseWriter, r *http.Request) {
ReturnStatusOK(w)
}
+
+func getAllTeams(c *Context, w http.ResponseWriter, r *http.Request) {
+ var teams []*model.Team
+ var err *model.AppError
+
+ if app.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) {
+ teams, err = app.GetAllTeamsPage(c.Params.Page, c.Params.PerPage)
+ } else {
+ teams, err = app.GetAllOpenTeamsPage(c.Params.Page, c.Params.PerPage)
+ }
+
+ if err != nil {
+ c.Err = err
+ return
+ }
+
+ w.Write([]byte(model.TeamListToJson(teams)))
+}
diff --git a/api4/team_test.go b/api4/team_test.go
index 327a8e16f..a4ec1a6e2 100644
--- a/api4/team_test.go
+++ b/api4/team_test.go
@@ -114,6 +114,54 @@ func TestGetTeam(t *testing.T) {
CheckNoError(t, resp)
}
+func TestGetAllTeams(t *testing.T) {
+ th := Setup().InitBasic().InitSystemAdmin()
+ defer TearDown()
+ Client := th.Client
+
+ team := &model.Team{DisplayName: "Name", Name: GenerateTestTeamName(), Email: GenerateTestEmail(), Type: model.TEAM_OPEN, AllowOpenInvite: true}
+ _, resp := Client.CreateTeam(team)
+ CheckNoError(t, resp)
+
+ rrteams, resp := Client.GetAllTeams("", 1, 1)
+ CheckNoError(t, resp)
+
+ if (len(rrteams) != 1) {
+ t.Fatal("wrong number of teams - should be 1")
+ }
+
+ for _, rt := range rrteams {
+ if rt.Type != model.TEAM_OPEN {
+ t.Fatal("not all teams are open")
+ }
+ }
+
+ rrteams1, resp := Client.GetAllTeams("", 1, 0)
+ CheckNoError(t, resp)
+
+ if (len(rrteams1) != 0) {
+ t.Fatal("wrong number of teams - should be 0")
+ }
+
+ rrteams2, resp := th.SystemAdminClient.GetAllTeams("", 1, 1)
+ CheckNoError(t, resp)
+
+ if (len(rrteams2) != 1) {
+ t.Fatal("wrong number of teams - should be 1")
+ }
+
+ rrteams2, resp = Client.GetAllTeams("", 1, 0)
+ CheckNoError(t, resp)
+
+ if (len(rrteams2) != 0) {
+ t.Fatal("wrong number of teams - should be 0")
+ }
+
+ Client.Logout()
+ _, resp = Client.GetAllTeams("", 1, 10)
+ CheckUnauthorizedStatus(t, resp)
+}
+
func TestGetTeamByName(t *testing.T) {
th := Setup().InitBasic().InitSystemAdmin()
defer TearDown()
diff --git a/app/team.go b/app/team.go
index 0c0a6a4da..b1e0f1362 100644
--- a/app/team.go
+++ b/app/team.go
@@ -327,6 +327,14 @@ func GetAllTeams() ([]*model.Team, *model.AppError) {
}
}
+func GetAllTeamsPage(offset int, limit int) ([]*model.Team, *model.AppError) {
+ if result := <-Srv.Store.Team().GetAllPage(offset, limit); result.Err != nil {
+ return nil, result.Err
+ } else {
+ return result.Data.([]*model.Team), nil
+ }
+}
+
func GetAllOpenTeams() ([]*model.Team, *model.AppError) {
if result := <-Srv.Store.Team().GetAllTeamListing(); result.Err != nil {
return nil, result.Err
@@ -335,6 +343,14 @@ func GetAllOpenTeams() ([]*model.Team, *model.AppError) {
}
}
+func GetAllOpenTeamsPage(offset int, limit int) ([]*model.Team, *model.AppError) {
+ if result := <-Srv.Store.Team().GetAllTeamPageListing(offset, limit); result.Err != nil {
+ return nil, result.Err
+ } else {
+ return result.Data.([]*model.Team), nil
+ }
+}
+
func GetTeamsForUser(userId string) ([]*model.Team, *model.AppError) {
if result := <-Srv.Store.Team().GetTeamsByUserId(userId); result.Err != nil {
return nil, result.Err
diff --git a/model/client4.go b/model/client4.go
index 2a762aa9d..ff35f3cf3 100644
--- a/model/client4.go
+++ b/model/client4.go
@@ -523,6 +523,17 @@ func (c *Client4) GetTeam(teamId, etag string) (*Team, *Response) {
}
}
+// GetAllTeams returns all teams based on permissions.
+func (c *Client4) GetAllTeams(etag string, page int, perPage int) ([]*Team, *Response) {
+ query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage)
+ if r, err := c.DoApiGet(c.GetTeamsRoute()+query, etag); err != nil {
+ return nil, &Response{StatusCode: r.StatusCode, Error: err}
+ } else {
+ defer closeBody(r)
+ return TeamListFromJson(r.Body), BuildResponse(r)
+ }
+}
+
// GetTeamByName returns a team based on the provided team name string.
func (c *Client4) GetTeamByName(name, etag string) (*Team, *Response) {
if r, err := c.DoApiGet(c.GetTeamByNameRoute(name), etag); err != nil {
diff --git a/store/sql_team_store.go b/store/sql_team_store.go
index 9ef420943..bd99ed95c 100644
--- a/store/sql_team_store.go
+++ b/store/sql_team_store.go
@@ -283,6 +283,32 @@ func (s SqlTeamStore) GetAll() StoreChannel {
return storeChannel
}
+func (s SqlTeamStore) GetAllPage(offset int, limit int) StoreChannel {
+ storeChannel := make(StoreChannel, 1)
+
+ go func() {
+ result := StoreResult{}
+
+ var data []*model.Team
+ if _, err := s.GetReplica().Select(&data, "SELECT * FROM Teams LIMIT :Limit OFFSET :Offset", map[string]interface{}{"Offset": offset, "Limit": limit}); err != nil {
+ result.Err = model.NewLocAppError("SqlTeamStore.GetAllTeams", "store.sql_team.get_all.app_error", nil, err.Error())
+ }
+
+ for _, team := range data {
+ if len(team.InviteId) == 0 {
+ team.InviteId = team.Id
+ }
+ }
+
+ result.Data = data
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}
+
func (s SqlTeamStore) GetTeamsByUserId(userId string) StoreChannel {
storeChannel := make(StoreChannel, 1)
@@ -341,6 +367,38 @@ func (s SqlTeamStore) GetAllTeamListing() StoreChannel {
return storeChannel
}
+func (s SqlTeamStore) GetAllTeamPageListing(offset int, limit int) StoreChannel {
+ storeChannel := make(StoreChannel, 1)
+
+ go func() {
+ result := StoreResult{}
+
+ query := "SELECT * FROM Teams WHERE AllowOpenInvite = 1 LIMIT :Limit OFFSET :Offset"
+
+ if utils.Cfg.SqlSettings.DriverName == model.DATABASE_DRIVER_POSTGRES {
+ query = "SELECT * FROM Teams WHERE AllowOpenInvite = true LIMIT :Limit OFFSET :Offset"
+ }
+
+ var data []*model.Team
+ if _, err := s.GetReplica().Select(&data, query, map[string]interface{}{"Offset": offset, "Limit": limit}); err != nil {
+ result.Err = model.NewLocAppError("SqlTeamStore.GetAllTeamListing", "store.sql_team.get_all_team_listing.app_error", nil, err.Error())
+ }
+
+ for _, team := range data {
+ if len(team.InviteId) == 0 {
+ team.InviteId = team.Id
+ }
+ }
+
+ result.Data = data
+
+ storeChannel <- result
+ close(storeChannel)
+ }()
+
+ return storeChannel
+}
+
func (s SqlTeamStore) PermanentDelete(teamId string) StoreChannel {
storeChannel := make(StoreChannel, 1)
diff --git a/store/store.go b/store/store.go
index 4226f03a5..57741742c 100644
--- a/store/store.go
+++ b/store/store.go
@@ -62,7 +62,9 @@ type TeamStore interface {
GetByName(name string) StoreChannel
SearchByName(name string) StoreChannel
GetAll() StoreChannel
+ GetAllPage(offset int, limit int) StoreChannel
GetAllTeamListing() StoreChannel
+ GetAllTeamPageListing(offset int, limit int) StoreChannel
GetTeamsByUserId(userId string) StoreChannel
GetByInviteId(inviteId string) StoreChannel
PermanentDelete(teamId string) StoreChannel