diff --git a/api4/channel.go b/api4/channel.go index 3c57174bf6..f23b7791ba 100644 --- a/api4/channel.go +++ b/api4/channel.go @@ -753,7 +753,7 @@ func getChannelsForTeamForUser(c *Context, w http.ResponseWriter, r *http.Reques return } - channels, err := c.App.GetChannelsForUser(c.Params.TeamId, c.Params.UserId, false) + channels, err := c.App.GetChannelsForUser(c.Params.TeamId, c.Params.UserId, c.Params.IncludeDeleted) if err != nil { c.Err = err return diff --git a/api4/channel_test.go b/api4/channel_test.go index 45c6e06cbe..a06d1366e2 100644 --- a/api4/channel_test.go +++ b/api4/channel_test.go @@ -776,43 +776,64 @@ func TestGetChannelsForTeamForUser(t *testing.T) { defer th.TearDown() Client := th.Client - channels, resp := Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, "") - CheckNoError(t, resp) + t.Run("get channels for the team for user", func(t *testing.T) { + channels, resp := Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") + CheckNoError(t, resp) - found := make([]bool, 3) - for _, c := range channels { - if c.Id == th.BasicChannel.Id { - found[0] = true - } else if c.Id == th.BasicChannel2.Id { - found[1] = true - } else if c.Id == th.BasicPrivateChannel.Id { - found[2] = true + found := make([]bool, 3) + for _, c := range channels { + if c.Id == th.BasicChannel.Id { + found[0] = true + } else if c.Id == th.BasicChannel2.Id { + found[1] = true + } else if c.Id == th.BasicPrivateChannel.Id { + found[2] = true + } + + require.True(t, c.TeamId == "" || c.TeamId == th.BasicTeam.Id) } - require.True(t, c.TeamId == "" || c.TeamId == th.BasicTeam.Id) - } + for _, f := range found { + require.True(t, f, "missing a channel") + } - for _, f := range found { - require.True(t, f, "missing a channel") - } + channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, resp.Etag) + CheckEtag(t, channels, resp) - channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, resp.Etag) - CheckEtag(t, channels, resp) + _, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, "junk", false, "") + CheckBadRequestStatus(t, resp) - _, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, "junk", "") - CheckBadRequestStatus(t, resp) + _, resp = Client.GetChannelsForTeamForUser("junk", th.BasicUser.Id, false, "") + CheckBadRequestStatus(t, resp) - _, resp = Client.GetChannelsForTeamForUser("junk", th.BasicUser.Id, "") - CheckBadRequestStatus(t, resp) + _, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser2.Id, false, "") + CheckForbiddenStatus(t, resp) - _, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser2.Id, "") - CheckForbiddenStatus(t, resp) + _, resp = Client.GetChannelsForTeamForUser(model.NewId(), th.BasicUser.Id, false, "") + CheckForbiddenStatus(t, resp) - _, resp = Client.GetChannelsForTeamForUser(model.NewId(), th.BasicUser.Id, "") - CheckForbiddenStatus(t, resp) + _, resp = th.SystemAdminClient.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") + CheckNoError(t, resp) + }) - _, resp = th.SystemAdminClient.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, "") - CheckNoError(t, resp) + t.Run("deleted channel could be retrieved using the proper flag", func(t *testing.T) { + testChannel := &model.Channel{ + DisplayName: "dn_" + model.NewId(), + Name: GenerateTestChannelName(), + Type: model.CHANNEL_OPEN, + TeamId: th.BasicTeam.Id, + CreatorId: th.BasicUser.Id, + } + th.App.CreateChannel(testChannel, true) + defer th.App.PermanentDeleteChannel(testChannel) + channels, resp := Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") + CheckNoError(t, resp) + assert.Equal(t, 6, len(channels)) + th.App.DeleteChannel(testChannel, th.BasicUser.Id) + channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "") + CheckNoError(t, resp) + assert.Equal(t, 5, len(channels)) + }) } func TestGetAllChannels(t *testing.T) { diff --git a/api4/commands_test.go b/api4/commands_test.go index f7b8cb501d..17e236fe51 100644 --- a/api4/commands_test.go +++ b/api4/commands_test.go @@ -118,7 +118,7 @@ func testJoinCommands(t *testing.T, alias string) { rs6 := Client.Must(Client.ExecuteCommand(channel0.Id, "/"+alias+" "+channel3.Name)).(*model.CommandResponse) require.False(t, strings.HasSuffix(rs6.GotoLocation, "/"+team.Name+"/channels/"+channel3.Name), "should not have joined direct message channel") - c1 := Client.Must(Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, "")).([]*model.Channel) + c1 := Client.Must(Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "")).([]*model.Channel) found := false for _, c := range c1 { @@ -261,7 +261,7 @@ func TestLeaveCommands(t *testing.T) { _, err := Client.ExecuteCommand(channel3.Id, "/leave") require.NotNil(t, err, "should fail leaving direct channel") - cdata := Client.Must(Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, "")).([]*model.Channel) + cdata := Client.Must(Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "")).([]*model.Channel) found := false for _, c := range cdata { diff --git a/app/channel_test.go b/app/channel_test.go index d5cd6e623a..e5d98fe177 100644 --- a/app/channel_test.go +++ b/app/channel_test.go @@ -107,6 +107,7 @@ func TestMoveChannel(t *testing.T) { // It should fail, unless removeDeactivatedMembers is true. deacivatedUser := th.CreateUser() channel2 := th.CreateChannel(sourceTeam) + defer th.App.PermanentDeleteChannel(channel2) _, err = th.App.AddUserToTeam(sourceTeam.Id, deacivatedUser.Id, "") require.Nil(t, err) @@ -136,6 +137,7 @@ func TestMoveChannel(t *testing.T) { channel3, err = th.App.CreateChannel(channel3, false) require.Nil(t, err) + defer th.App.PermanentDeleteChannel(channel3) err = th.App.MoveChannel(targetTeam, channel3, th.BasicUser, false) assert.Nil(t, err) @@ -208,6 +210,7 @@ func TestJoinDefaultChannelsExperimentalDefaultChannels(t *testing.T) { defer th.TearDown() basicChannel2 := th.CreateChannel(th.BasicTeam) + defer th.App.PermanentDeleteChannel(basicChannel2) defaultChannelList := []string{th.BasicChannel.Name, basicChannel2.Name, basicChannel2.Name} th.App.Config().TeamSettings.ExperimentalDefaultChannels = defaultChannelList @@ -259,6 +262,7 @@ func TestCreateChannelDisplayNameTrimsWhitespace(t *testing.T) { defer th.TearDown() channel, err := th.App.CreateChannel(&model.Channel{DisplayName: " Public 1 ", Name: "public1", Type: model.CHANNEL_OPEN, TeamId: th.BasicTeam.Id}, false) + defer th.App.PermanentDeleteChannel(channel) require.Nil(t, err) require.Equal(t, channel.DisplayName, "Public 1") } @@ -390,30 +394,6 @@ func TestAddUserToChannelCreatesChannelMemberHistoryRecord(t *testing.T) { assert.Equal(t, groupUserIds, channelMemberHistoryUserIds) } -/*func TestRemoveUserFromChannelUpdatesChannelMemberHistoryRecord(t *testing.T) { - th := Setup(t).InitBasic() - defer th.TearDown() - - // a user creates a channel - publicChannel := th.createChannel(th.BasicTeam, model.CHANNEL_OPEN) - histories, err := th.App.Srv().Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, publicChannel.Id) - require.Nil(t, err) - assert.Len(t, histories, 1) - assert.Equal(t, th.BasicUser.Id, histories[0].UserId) - assert.Equal(t, publicChannel.Id, histories[0].ChannelId) - assert.Nil(t, histories[0].LeaveTime) - - // the user leaves that channel - if err := th.App.LeaveChannel(publicChannel.Id, th.BasicUser.Id); err != nil { - require.Fail(t, "Failed to remove user from channel. Error: " + err.Message) - } - histories = store.Must(th.App.Srv().Store.ChannelMemberHistory().GetUsersInChannelDuring(model.GetMillis()-100, model.GetMillis()+100, publicChannel.Id)).([]*model.ChannelMemberHistoryResult) - assert.Len(t, histories, 1) - assert.Equal(t, th.BasicUser.Id, histories[0].UserId) - assert.Equal(t, publicChannel.Id, histories[0].ChannelId) - assert.NotNil(t, histories[0].LeaveTime) -}*/ - func TestLeaveDefaultChannel(t *testing.T) { th := Setup(t).InitBasic() defer th.TearDown() @@ -828,6 +808,36 @@ func TestGetChannelMembersTimezones(t *testing.T) { assert.Equal(t, 2, len(timezones)) } +func TestGetChannelsForUser(t *testing.T) { + th := Setup(t).InitBasic() + channel := &model.Channel{ + DisplayName: fmt.Sprintf("Public"), + Name: fmt.Sprintf("public"), + Type: model.CHANNEL_OPEN, + CreatorId: th.BasicUser.Id, + TeamId: th.BasicTeam.Id, + } + th.App.CreateChannel(channel, true) + defer th.App.PermanentDeleteChannel(channel) + defer th.TearDown() + + channelList, err := th.App.GetChannelsForUser(th.BasicTeam.Id, th.BasicUser.Id, false) + require.Nil(t, err) + require.Len(t, *channelList, 4) + + th.App.DeleteChannel(channel, th.BasicUser.Id) + + // Now we get all the non-archived channels for the user + channelList, err = th.App.GetChannelsForUser(th.BasicTeam.Id, th.BasicUser.Id, false) + require.Nil(t, err) + require.Len(t, *channelList, 3) + + // Now we get all the channels, even though are archived, for the user + channelList, err = th.App.GetChannelsForUser(th.BasicTeam.Id, th.BasicUser.Id, true) + require.Nil(t, err) + require.Len(t, *channelList, 4) +} + func TestGetPublicChannelsForTeam(t *testing.T) { th := Setup(t) team := th.CreateTeam() diff --git a/model/client4.go b/model/client4.go index adff06be14..236eed9268 100644 --- a/model/client4.go +++ b/model/client4.go @@ -212,6 +212,15 @@ func (c *Client4) GetChannelByNameRoute(channelName, teamId string) string { return fmt.Sprintf(c.GetTeamRoute(teamId)+"/channels/name/%v", channelName) } +func (c *Client4) GetChannelsForTeamForUserRoute(teamId, userId string, includeDeleted bool) string { + route := fmt.Sprintf(c.GetUserRoute(userId) + c.GetTeamRoute(teamId) + "/channels") + if includeDeleted { + query := fmt.Sprintf("?include_deleted=%v", includeDeleted) + return route + query + } + return route +} + func (c *Client4) GetChannelByNameForTeamNameRoute(channelName, teamName string) string { return fmt.Sprintf(c.GetTeamByNameRoute(teamName)+"/channels/name/%v", channelName) } @@ -2282,8 +2291,8 @@ func (c *Client4) GetPublicChannelsByIdsForTeam(teamId string, channelIds []stri } // GetChannelsForTeamForUser returns a list channels of on a team for a user. -func (c *Client4) GetChannelsForTeamForUser(teamId, userId, etag string) ([]*Channel, *Response) { - r, err := c.DoApiGet(c.GetUserRoute(userId)+c.GetTeamRoute(teamId)+"/channels", etag) +func (c *Client4) GetChannelsForTeamForUser(teamId, userId string, includeDeleted bool, etag string) ([]*Channel, *Response) { + r, err := c.DoApiGet(c.GetChannelsForTeamForUserRoute(teamId, userId, includeDeleted), etag) if err != nil { return nil, BuildErrorResponse(r, err) } diff --git a/web/params.go b/web/params.go index a01ba5c6de..6c8d9b18fa 100644 --- a/web/params.go +++ b/web/params.go @@ -74,6 +74,7 @@ type Params struct { LimitBefore int GroupIDs string IncludeTotalCount bool + IncludeDeleted bool } func ParamsFromRequest(r *http.Request) *Params { @@ -296,5 +297,9 @@ func ParamsFromRequest(r *http.Request) *Params { params.IncludeTotalCount = val } + if val, err := strconv.ParseBool(query.Get("include_deleted")); err == nil { + params.IncludeDeleted = val + } + return params }