MM-27204 Remove channels from old category when creating new one (#15108)
* MM-27204 Remove channels from old category when creating new one * Actually run unit tests
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
50fa5f0f3e
Коммит
b15aba63f1
@@ -3581,19 +3581,56 @@ func (s SqlChannelStore) CreateSidebarCategory(userId, teamId string, newCategor
|
|||||||
if err = transaction.Insert(category); err != nil {
|
if err = transaction.Insert(category); err != nil {
|
||||||
return nil, model.NewAppError("SqlPostStore.CreateSidebarCategory", "store.sql_channel.sidebar_categories.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, model.NewAppError("SqlPostStore.CreateSidebarCategory", "store.sql_channel.sidebar_categories.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
var channels []interface{}
|
|
||||||
runningOrder := 0
|
if len(newCategory.Channels) > 0 {
|
||||||
for _, channelID := range newCategory.Channels {
|
channelIdsKeys, deleteParams := MapStringsToQueryParams(newCategory.Channels, "ChannelId")
|
||||||
channels = append(channels, &model.SidebarChannel{
|
deleteParams["UserId"] = userId
|
||||||
ChannelId: channelID,
|
deleteParams["TeamId"] = teamId
|
||||||
CategoryId: newCategoryId,
|
|
||||||
SortOrder: int64(runningOrder),
|
// Remove any channels from their previous categories and add them to the new one
|
||||||
UserId: userId,
|
var deleteQuery string
|
||||||
})
|
if s.DriverName() == model.DATABASE_DRIVER_MYSQL {
|
||||||
runningOrder += model.MinimalSidebarSortDistance
|
deleteQuery = `
|
||||||
}
|
DELETE
|
||||||
if err = transaction.Insert(channels...); err != nil {
|
SidebarChannels
|
||||||
return nil, model.NewAppError("SqlPostStore.CreateSidebarCategory", "store.sql_channel.sidebar_categories.app_error", nil, err.Error(), http.StatusInternalServerError)
|
FROM
|
||||||
|
SidebarChannels
|
||||||
|
JOIN
|
||||||
|
SidebarCategories ON SidebarChannels.CategoryId = SidebarCategories.Id
|
||||||
|
WHERE
|
||||||
|
SidebarChannels.UserId = :UserId
|
||||||
|
AND SidebarChannels.ChannelId IN ` + channelIdsKeys + `
|
||||||
|
AND SidebarCategories.TeamId = :TeamId`
|
||||||
|
} else {
|
||||||
|
deleteQuery = `
|
||||||
|
DELETE FROM
|
||||||
|
SidebarChannels
|
||||||
|
USING
|
||||||
|
SidebarCategories
|
||||||
|
WHERE
|
||||||
|
SidebarChannels.CategoryId = SidebarCategories.Id
|
||||||
|
AND SidebarChannels.UserId = :UserId
|
||||||
|
AND SidebarChannels.ChannelId IN ` + channelIdsKeys + `
|
||||||
|
AND SidebarCategories.TeamId = :TeamId`
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = transaction.Exec(deleteQuery, deleteParams)
|
||||||
|
if err != nil {
|
||||||
|
return nil, model.NewAppError("SqlPostStore.CreateSidebarCategory", "store.sql_channel.sidebar_categories.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||||
|
}
|
||||||
|
|
||||||
|
var channels []interface{}
|
||||||
|
for i, channelID := range newCategory.Channels {
|
||||||
|
channels = append(channels, &model.SidebarChannel{
|
||||||
|
ChannelId: channelID,
|
||||||
|
CategoryId: newCategoryId,
|
||||||
|
SortOrder: int64(i * model.MinimalSidebarSortDistance),
|
||||||
|
UserId: userId,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if err = transaction.Insert(channels...); err != nil {
|
||||||
|
return nil, model.NewAppError("SqlPostStore.CreateSidebarCategory", "store.sql_channel.sidebar_categories.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// now we re-order the categories according to the new order
|
// now we re-order the categories according to the new order
|
||||||
|
|||||||
@@ -102,6 +102,7 @@ func TestChannelStore(t *testing.T, ss store.Store, s SqlSupplier) {
|
|||||||
t.Run("GetChannelsBatchForIndexing", func(t *testing.T) { testChannelStoreGetChannelsBatchForIndexing(t, ss) })
|
t.Run("GetChannelsBatchForIndexing", func(t *testing.T) { testChannelStoreGetChannelsBatchForIndexing(t, ss) })
|
||||||
t.Run("GroupSyncedChannelCount", func(t *testing.T) { testGroupSyncedChannelCount(t, ss) })
|
t.Run("GroupSyncedChannelCount", func(t *testing.T) { testGroupSyncedChannelCount(t, ss) })
|
||||||
t.Run("CreateInitialSidebarCategories", func(t *testing.T) { testCreateInitialSidebarCategories(t, ss) })
|
t.Run("CreateInitialSidebarCategories", func(t *testing.T) { testCreateInitialSidebarCategories(t, ss) })
|
||||||
|
t.Run("CreateSidebarCategory", func(t *testing.T) { testCreateSidebarCategory(t, ss) })
|
||||||
t.Run("GetSidebarCategory", func(t *testing.T) { testGetSidebarCategory(t, ss, s) })
|
t.Run("GetSidebarCategory", func(t *testing.T) { testGetSidebarCategory(t, ss, s) })
|
||||||
t.Run("GetSidebarCategories", func(t *testing.T) { testGetSidebarCategories(t, ss) })
|
t.Run("GetSidebarCategories", func(t *testing.T) { testGetSidebarCategories(t, ss) })
|
||||||
t.Run("UpdateSidebarCategories", func(t *testing.T) { testUpdateSidebarCategories(t, ss, s) })
|
t.Run("UpdateSidebarCategories", func(t *testing.T) { testUpdateSidebarCategories(t, ss, s) })
|
||||||
@@ -8132,6 +8133,164 @@ func testCreateInitialSidebarCategories(t *testing.T, ss store.Store) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testCreateSidebarCategory(t *testing.T, ss store.Store) {
|
||||||
|
t.Run("should place the new category second if Favorites comes first", func(t *testing.T) {
|
||||||
|
userId := model.NewId()
|
||||||
|
teamId := model.NewId()
|
||||||
|
|
||||||
|
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
|
||||||
|
require.Nil(t, nErr)
|
||||||
|
|
||||||
|
// Create the category
|
||||||
|
created, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
|
||||||
|
SidebarCategory: model.SidebarCategory{
|
||||||
|
DisplayName: model.NewId(),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
require.Nil(t, err)
|
||||||
|
|
||||||
|
// Confirm that it comes second
|
||||||
|
res, err := ss.Channel().GetSidebarCategories(userId, teamId)
|
||||||
|
require.Nil(t, err)
|
||||||
|
require.Len(t, res.Categories, 4)
|
||||||
|
assert.Equal(t, model.SidebarCategoryFavorites, res.Categories[0].Type)
|
||||||
|
assert.Equal(t, model.SidebarCategoryCustom, res.Categories[1].Type)
|
||||||
|
assert.Equal(t, created.Id, res.Categories[1].Id)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("should place the new category first if Favorites is not first", func(t *testing.T) {
|
||||||
|
userId := model.NewId()
|
||||||
|
teamId := model.NewId()
|
||||||
|
|
||||||
|
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
|
||||||
|
require.Nil(t, nErr)
|
||||||
|
|
||||||
|
// Re-arrange the categories so that Favorites comes last
|
||||||
|
categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
|
||||||
|
require.Nil(t, err)
|
||||||
|
require.Len(t, categories.Categories, 3)
|
||||||
|
require.Equal(t, model.SidebarCategoryFavorites, categories.Categories[0].Type)
|
||||||
|
|
||||||
|
err = ss.Channel().UpdateSidebarCategoryOrder(userId, teamId, []string{
|
||||||
|
categories.Categories[1].Id,
|
||||||
|
categories.Categories[2].Id,
|
||||||
|
categories.Categories[0].Id,
|
||||||
|
})
|
||||||
|
require.Nil(t, err)
|
||||||
|
|
||||||
|
// Create the category
|
||||||
|
created, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
|
||||||
|
SidebarCategory: model.SidebarCategory{
|
||||||
|
DisplayName: model.NewId(),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
require.Nil(t, err)
|
||||||
|
|
||||||
|
// Confirm that it comes first
|
||||||
|
res, err := ss.Channel().GetSidebarCategories(userId, teamId)
|
||||||
|
require.Nil(t, err)
|
||||||
|
require.Len(t, res.Categories, 4)
|
||||||
|
assert.Equal(t, model.SidebarCategoryCustom, res.Categories[0].Type)
|
||||||
|
assert.Equal(t, created.Id, res.Categories[0].Id)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("should create the category with its channels", func(t *testing.T) {
|
||||||
|
userId := model.NewId()
|
||||||
|
teamId := model.NewId()
|
||||||
|
|
||||||
|
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
|
||||||
|
require.Nil(t, nErr)
|
||||||
|
|
||||||
|
// Create some channels
|
||||||
|
channel1, err := ss.Channel().Save(&model.Channel{
|
||||||
|
Type: model.CHANNEL_OPEN,
|
||||||
|
TeamId: teamId,
|
||||||
|
Name: model.NewId(),
|
||||||
|
}, 100)
|
||||||
|
require.Nil(t, err)
|
||||||
|
channel2, err := ss.Channel().Save(&model.Channel{
|
||||||
|
Type: model.CHANNEL_OPEN,
|
||||||
|
TeamId: teamId,
|
||||||
|
Name: model.NewId(),
|
||||||
|
}, 100)
|
||||||
|
require.Nil(t, err)
|
||||||
|
|
||||||
|
// Create the category
|
||||||
|
created, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
|
||||||
|
SidebarCategory: model.SidebarCategory{
|
||||||
|
DisplayName: model.NewId(),
|
||||||
|
},
|
||||||
|
Channels: []string{channel2.Id, channel1.Id},
|
||||||
|
})
|
||||||
|
require.Nil(t, err)
|
||||||
|
assert.Equal(t, []string{channel2.Id, channel1.Id}, created.Channels)
|
||||||
|
|
||||||
|
// Get the channel again to ensure that the SidebarChannels were saved correctly
|
||||||
|
res, err := ss.Channel().GetSidebarCategory(created.Id)
|
||||||
|
require.Nil(t, err)
|
||||||
|
assert.Equal(t, []string{channel2.Id, channel1.Id}, res.Channels)
|
||||||
|
})
|
||||||
|
|
||||||
|
t.Run("should remove any channels from their previous categories", func(t *testing.T) {
|
||||||
|
userId := model.NewId()
|
||||||
|
teamId := model.NewId()
|
||||||
|
|
||||||
|
nErr := ss.Channel().CreateInitialSidebarCategories(userId, teamId)
|
||||||
|
require.Nil(t, nErr)
|
||||||
|
|
||||||
|
categories, err := ss.Channel().GetSidebarCategories(userId, teamId)
|
||||||
|
require.Nil(t, err)
|
||||||
|
require.Len(t, categories.Categories, 3)
|
||||||
|
|
||||||
|
favoritesCategory := categories.Categories[0]
|
||||||
|
require.Equal(t, model.SidebarCategoryFavorites, favoritesCategory.Type)
|
||||||
|
channelsCategory := categories.Categories[1]
|
||||||
|
require.Equal(t, model.SidebarCategoryChannels, channelsCategory.Type)
|
||||||
|
|
||||||
|
// Create some channels
|
||||||
|
channel1, nErr := ss.Channel().Save(&model.Channel{
|
||||||
|
Type: model.CHANNEL_OPEN,
|
||||||
|
TeamId: teamId,
|
||||||
|
Name: model.NewId(),
|
||||||
|
}, 100)
|
||||||
|
require.Nil(t, nErr)
|
||||||
|
channel2, nErr := ss.Channel().Save(&model.Channel{
|
||||||
|
Type: model.CHANNEL_OPEN,
|
||||||
|
TeamId: teamId,
|
||||||
|
Name: model.NewId(),
|
||||||
|
}, 100)
|
||||||
|
require.Nil(t, nErr)
|
||||||
|
|
||||||
|
// Assign them to categories
|
||||||
|
favoritesCategory.Channels = []string{channel1.Id}
|
||||||
|
channelsCategory.Channels = []string{channel2.Id}
|
||||||
|
_, err = ss.Channel().UpdateSidebarCategories(userId, teamId, []*model.SidebarCategoryWithChannels{
|
||||||
|
favoritesCategory,
|
||||||
|
channelsCategory,
|
||||||
|
})
|
||||||
|
require.Nil(t, err)
|
||||||
|
|
||||||
|
// Create the category
|
||||||
|
created, err := ss.Channel().CreateSidebarCategory(userId, teamId, &model.SidebarCategoryWithChannels{
|
||||||
|
SidebarCategory: model.SidebarCategory{
|
||||||
|
DisplayName: model.NewId(),
|
||||||
|
},
|
||||||
|
Channels: []string{channel2.Id, channel1.Id},
|
||||||
|
})
|
||||||
|
require.Nil(t, err)
|
||||||
|
assert.Equal(t, []string{channel2.Id, channel1.Id}, created.Channels)
|
||||||
|
|
||||||
|
// Confirm that the channels were removed from their original categories
|
||||||
|
res, err := ss.Channel().GetSidebarCategory(favoritesCategory.Id)
|
||||||
|
require.Nil(t, err)
|
||||||
|
assert.Equal(t, []string{}, res.Channels)
|
||||||
|
|
||||||
|
res, err = ss.Channel().GetSidebarCategory(channelsCategory.Id)
|
||||||
|
require.Nil(t, err)
|
||||||
|
assert.Equal(t, []string{}, res.Channels)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func testDeleteSidebarCategory(t *testing.T, ss store.Store, s SqlSupplier) {
|
func testDeleteSidebarCategory(t *testing.T, ss store.Store, s SqlSupplier) {
|
||||||
setupInitialSidebarCategories := func(t *testing.T, ss store.Store) (string, string) {
|
setupInitialSidebarCategories := func(t *testing.T, ss store.Store) (string, string) {
|
||||||
userId := model.NewId()
|
userId := model.NewId()
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user