Include deleted channels on get user channels endpoint (#13877)
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
8f0bedf9c9
Коммит
a43439dd60
@@ -753,7 +753,7 @@ func getChannelsForTeamForUser(c *Context, w http.ResponseWriter, r *http.Reques
|
|||||||
return
|
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 {
|
if err != nil {
|
||||||
c.Err = err
|
c.Err = err
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -776,7 +776,8 @@ func TestGetChannelsForTeamForUser(t *testing.T) {
|
|||||||
defer th.TearDown()
|
defer th.TearDown()
|
||||||
Client := th.Client
|
Client := th.Client
|
||||||
|
|
||||||
channels, resp := Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, "")
|
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)
|
CheckNoError(t, resp)
|
||||||
|
|
||||||
found := make([]bool, 3)
|
found := make([]bool, 3)
|
||||||
@@ -796,23 +797,43 @@ func TestGetChannelsForTeamForUser(t *testing.T) {
|
|||||||
require.True(t, f, "missing a channel")
|
require.True(t, f, "missing a channel")
|
||||||
}
|
}
|
||||||
|
|
||||||
channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, resp.Etag)
|
channels, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, resp.Etag)
|
||||||
CheckEtag(t, channels, resp)
|
CheckEtag(t, channels, resp)
|
||||||
|
|
||||||
_, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, "junk", "")
|
_, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, "junk", false, "")
|
||||||
CheckBadRequestStatus(t, resp)
|
CheckBadRequestStatus(t, resp)
|
||||||
|
|
||||||
_, resp = Client.GetChannelsForTeamForUser("junk", th.BasicUser.Id, "")
|
_, resp = Client.GetChannelsForTeamForUser("junk", th.BasicUser.Id, false, "")
|
||||||
CheckBadRequestStatus(t, resp)
|
CheckBadRequestStatus(t, resp)
|
||||||
|
|
||||||
_, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser2.Id, "")
|
_, resp = Client.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser2.Id, false, "")
|
||||||
CheckForbiddenStatus(t, resp)
|
CheckForbiddenStatus(t, resp)
|
||||||
|
|
||||||
_, resp = Client.GetChannelsForTeamForUser(model.NewId(), th.BasicUser.Id, "")
|
_, resp = Client.GetChannelsForTeamForUser(model.NewId(), th.BasicUser.Id, false, "")
|
||||||
CheckForbiddenStatus(t, resp)
|
CheckForbiddenStatus(t, resp)
|
||||||
|
|
||||||
_, resp = th.SystemAdminClient.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, "")
|
_, resp = th.SystemAdminClient.GetChannelsForTeamForUser(th.BasicTeam.Id, th.BasicUser.Id, false, "")
|
||||||
CheckNoError(t, resp)
|
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) {
|
func TestGetAllChannels(t *testing.T) {
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ func testJoinCommands(t *testing.T, alias string) {
|
|||||||
rs6 := Client.Must(Client.ExecuteCommand(channel0.Id, "/"+alias+" "+channel3.Name)).(*model.CommandResponse)
|
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")
|
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
|
found := false
|
||||||
for _, c := range c1 {
|
for _, c := range c1 {
|
||||||
@@ -261,7 +261,7 @@ func TestLeaveCommands(t *testing.T) {
|
|||||||
_, err := Client.ExecuteCommand(channel3.Id, "/leave")
|
_, err := Client.ExecuteCommand(channel3.Id, "/leave")
|
||||||
require.NotNil(t, err, "should fail leaving direct channel")
|
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
|
found := false
|
||||||
for _, c := range cdata {
|
for _, c := range cdata {
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ func TestMoveChannel(t *testing.T) {
|
|||||||
// It should fail, unless removeDeactivatedMembers is true.
|
// It should fail, unless removeDeactivatedMembers is true.
|
||||||
deacivatedUser := th.CreateUser()
|
deacivatedUser := th.CreateUser()
|
||||||
channel2 := th.CreateChannel(sourceTeam)
|
channel2 := th.CreateChannel(sourceTeam)
|
||||||
|
defer th.App.PermanentDeleteChannel(channel2)
|
||||||
|
|
||||||
_, err = th.App.AddUserToTeam(sourceTeam.Id, deacivatedUser.Id, "")
|
_, err = th.App.AddUserToTeam(sourceTeam.Id, deacivatedUser.Id, "")
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
@@ -136,6 +137,7 @@ func TestMoveChannel(t *testing.T) {
|
|||||||
|
|
||||||
channel3, err = th.App.CreateChannel(channel3, false)
|
channel3, err = th.App.CreateChannel(channel3, false)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
|
defer th.App.PermanentDeleteChannel(channel3)
|
||||||
|
|
||||||
err = th.App.MoveChannel(targetTeam, channel3, th.BasicUser, false)
|
err = th.App.MoveChannel(targetTeam, channel3, th.BasicUser, false)
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
@@ -208,6 +210,7 @@ func TestJoinDefaultChannelsExperimentalDefaultChannels(t *testing.T) {
|
|||||||
defer th.TearDown()
|
defer th.TearDown()
|
||||||
|
|
||||||
basicChannel2 := th.CreateChannel(th.BasicTeam)
|
basicChannel2 := th.CreateChannel(th.BasicTeam)
|
||||||
|
defer th.App.PermanentDeleteChannel(basicChannel2)
|
||||||
defaultChannelList := []string{th.BasicChannel.Name, basicChannel2.Name, basicChannel2.Name}
|
defaultChannelList := []string{th.BasicChannel.Name, basicChannel2.Name, basicChannel2.Name}
|
||||||
th.App.Config().TeamSettings.ExperimentalDefaultChannels = defaultChannelList
|
th.App.Config().TeamSettings.ExperimentalDefaultChannels = defaultChannelList
|
||||||
|
|
||||||
@@ -259,6 +262,7 @@ func TestCreateChannelDisplayNameTrimsWhitespace(t *testing.T) {
|
|||||||
defer th.TearDown()
|
defer th.TearDown()
|
||||||
|
|
||||||
channel, err := th.App.CreateChannel(&model.Channel{DisplayName: " Public 1 ", Name: "public1", Type: model.CHANNEL_OPEN, TeamId: th.BasicTeam.Id}, false)
|
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.Nil(t, err)
|
||||||
require.Equal(t, channel.DisplayName, "Public 1")
|
require.Equal(t, channel.DisplayName, "Public 1")
|
||||||
}
|
}
|
||||||
@@ -390,30 +394,6 @@ func TestAddUserToChannelCreatesChannelMemberHistoryRecord(t *testing.T) {
|
|||||||
assert.Equal(t, groupUserIds, channelMemberHistoryUserIds)
|
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) {
|
func TestLeaveDefaultChannel(t *testing.T) {
|
||||||
th := Setup(t).InitBasic()
|
th := Setup(t).InitBasic()
|
||||||
defer th.TearDown()
|
defer th.TearDown()
|
||||||
@@ -828,6 +808,36 @@ func TestGetChannelMembersTimezones(t *testing.T) {
|
|||||||
assert.Equal(t, 2, len(timezones))
|
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) {
|
func TestGetPublicChannelsForTeam(t *testing.T) {
|
||||||
th := Setup(t)
|
th := Setup(t)
|
||||||
team := th.CreateTeam()
|
team := th.CreateTeam()
|
||||||
|
|||||||
@@ -212,6 +212,15 @@ func (c *Client4) GetChannelByNameRoute(channelName, teamId string) string {
|
|||||||
return fmt.Sprintf(c.GetTeamRoute(teamId)+"/channels/name/%v", channelName)
|
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 {
|
func (c *Client4) GetChannelByNameForTeamNameRoute(channelName, teamName string) string {
|
||||||
return fmt.Sprintf(c.GetTeamByNameRoute(teamName)+"/channels/name/%v", channelName)
|
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.
|
// GetChannelsForTeamForUser returns a list channels of on a team for a user.
|
||||||
func (c *Client4) GetChannelsForTeamForUser(teamId, userId, etag string) ([]*Channel, *Response) {
|
func (c *Client4) GetChannelsForTeamForUser(teamId, userId string, includeDeleted bool, etag string) ([]*Channel, *Response) {
|
||||||
r, err := c.DoApiGet(c.GetUserRoute(userId)+c.GetTeamRoute(teamId)+"/channels", etag)
|
r, err := c.DoApiGet(c.GetChannelsForTeamForUserRoute(teamId, userId, includeDeleted), etag)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, BuildErrorResponse(r, err)
|
return nil, BuildErrorResponse(r, err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ type Params struct {
|
|||||||
LimitBefore int
|
LimitBefore int
|
||||||
GroupIDs string
|
GroupIDs string
|
||||||
IncludeTotalCount bool
|
IncludeTotalCount bool
|
||||||
|
IncludeDeleted bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func ParamsFromRequest(r *http.Request) *Params {
|
func ParamsFromRequest(r *http.Request) *Params {
|
||||||
@@ -296,5 +297,9 @@ func ParamsFromRequest(r *http.Request) *Params {
|
|||||||
params.IncludeTotalCount = val
|
params.IncludeTotalCount = val
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if val, err := strconv.ParseBool(query.Get("include_deleted")); err == nil {
|
||||||
|
params.IncludeDeleted = val
|
||||||
|
}
|
||||||
|
|
||||||
return params
|
return params
|
||||||
}
|
}
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user