From 2a88052c1470a0f4321f992795208920a003c7ae Mon Sep 17 00:00:00 2001 From: Leonard Gram Date: Wed, 6 Mar 2019 15:37:37 +0100 Subject: [PATCH] teams: can update team members permission. --- pkg/api/api.go | 1 + pkg/api/team_members.go | 15 +++++++++++++++ pkg/models/team_member.go | 7 +++++++ pkg/services/sqlstore/team.go | 24 ++++++++++++++++++++++++ pkg/services/sqlstore/team_test.go | 27 +++++++++++++++++++++++++++ 5 files changed, 74 insertions(+) diff --git a/pkg/api/api.go b/pkg/api/api.go index 3cbcc8029a3..e5d725342fe 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -159,6 +159,7 @@ func (hs *HTTPServer) registerRoutes() { teamsRoute.Delete("/:teamId", Wrap(DeleteTeamByID)) teamsRoute.Get("/:teamId/members", Wrap(GetTeamMembers)) teamsRoute.Post("/:teamId/members", bind(m.AddTeamMemberCommand{}), Wrap(AddTeamMember)) + teamsRoute.Put("/:teamId/members/:userId", bind(m.UpdateTeamMemberCommand{}), Wrap(UpdateTeamMember)) teamsRoute.Delete("/:teamId/members/:userId", Wrap(RemoveTeamMember)) teamsRoute.Get("/:teamId/preferences", Wrap(GetTeamPreferences)) teamsRoute.Put("/:teamId/preferences", bind(dtos.UpdatePrefsCmd{}), Wrap(UpdateTeamPreferences)) diff --git a/pkg/api/team_members.go b/pkg/api/team_members.go index 5b5970de6ad..e0919262111 100644 --- a/pkg/api/team_members.go +++ b/pkg/api/team_members.go @@ -50,6 +50,21 @@ func AddTeamMember(c *m.ReqContext, cmd m.AddTeamMemberCommand) Response { }) } +// PUT /:teamId/members/:userId +func UpdateTeamMember(c *m.ReqContext, cmd m.UpdateTeamMemberCommand) Response { + cmd.TeamId = c.ParamsInt64(":teamId") + cmd.UserId = c.ParamsInt64(":userId") + cmd.OrgId = c.OrgId + + if err := bus.Dispatch(&cmd); err != nil { + if err == m.ErrTeamMemberNotFound { + return Error(404, "Team member not found.", nil) + } + return Error(500, "Failed to update team member.", err) + } + return Success("Team member updated") +} + // DELETE /api/teams/:teamId/members/:userId func RemoveTeamMember(c *m.ReqContext) Response { if err := bus.Dispatch(&m.RemoveTeamMemberCommand{OrgId: c.OrgId, TeamId: c.ParamsInt64(":teamId"), UserId: c.ParamsInt64(":userId")}); err != nil { diff --git a/pkg/models/team_member.go b/pkg/models/team_member.go index 813455d3d2b..1140e39b095 100644 --- a/pkg/models/team_member.go +++ b/pkg/models/team_member.go @@ -34,6 +34,13 @@ type AddTeamMemberCommand struct { Permission int64 `json:"-"` } +type UpdateTeamMemberCommand struct { + UserId int64 `json:"-"` + OrgId int64 `json:"-"` + TeamId int64 `json:"-"` + Permission int64 `json:"permission"` +} + type RemoveTeamMemberCommand struct { OrgId int64 `json:"-"` UserId int64 diff --git a/pkg/services/sqlstore/team.go b/pkg/services/sqlstore/team.go index 546e0231706..4822af7009c 100644 --- a/pkg/services/sqlstore/team.go +++ b/pkg/services/sqlstore/team.go @@ -18,6 +18,7 @@ func init() { bus.AddHandler("sql", GetTeamsByUser) bus.AddHandler("sql", AddTeamMember) + bus.AddHandler("sql", UpdateTeamMember) bus.AddHandler("sql", RemoveTeamMember) bus.AddHandler("sql", GetTeamMembers) } @@ -254,6 +255,29 @@ func AddTeamMember(cmd *m.AddTeamMemberCommand) error { }) } +// UpdateTeamMember updates a team member +func UpdateTeamMember(cmd *m.UpdateTeamMemberCommand) error { + return inTransaction(func(sess *DBSession) error { + rawSql := `SELECT * FROM team_member WHERE org_id=? and team_id=? and user_id=?` + + var member m.TeamMember + exists, err := sess.SQL(rawSql, cmd.OrgId, cmd.TeamId, cmd.UserId).Get(&member) + + if err != nil { + return err + } + + if !exists { + return m.ErrTeamMemberNotFound + } + + member.Permission = cmd.Permission + _, err = sess.Update(member) + + return err + }) +} + // RemoveTeamMember removes a member from a team func RemoveTeamMember(cmd *m.RemoveTeamMemberCommand) error { return inTransaction(func(sess *DBSession) error { diff --git a/pkg/services/sqlstore/team_test.go b/pkg/services/sqlstore/team_test.go index 8f243617262..38b587facf3 100644 --- a/pkg/services/sqlstore/team_test.go +++ b/pkg/services/sqlstore/team_test.go @@ -75,6 +75,33 @@ func TestTeamCommandsAndQueries(t *testing.T) { So(q2.Result[0].External, ShouldEqual, true) }) + Convey("Should be able to update users in a team", func() { + userId := userIds[0] + team := group1.Result + addMemberCmd := m.AddTeamMemberCommand{OrgId: testOrgId, TeamId: team.Id, UserId: userId} + err = AddTeamMember(&addMemberCmd) + So(err, ShouldBeNil) + + qBeforeUpdate := &m.GetTeamMembersQuery{OrgId: testOrgId, TeamId: team.Id} + err = GetTeamMembers(qBeforeUpdate) + So(err, ShouldBeNil) + So(qBeforeUpdate.Result[0].Permission, ShouldEqual, 0) + + err = UpdateTeamMember(&m.UpdateTeamMemberCommand{ + UserId: userId, + OrgId: testOrgId, + TeamId: team.Id, + Permission: int64(m.PERMISSION_ADMIN), + }) + + So(err, ShouldBeNil) + + qAfterUpdate := &m.GetTeamMembersQuery{OrgId: testOrgId, TeamId: team.Id} + err = GetTeamMembers(qAfterUpdate) + So(err, ShouldBeNil) + So(qAfterUpdate.Result[0].Permission, ShouldEqual, m.PERMISSION_ADMIN) + }) + Convey("Should be able to search for teams", func() { query := &m.SearchTeamsQuery{OrgId: testOrgId, Query: "group", Page: 1} err = SearchTeams(query)