MM-46911: P1 - Fix MySQL query to filter bots out of TopDM (#20965)
Automatic Merge
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
78251a3ff1
Коммит
8b328386c5
@@ -897,7 +897,6 @@ func TestGetTopInactiveChannelsForTeamSince(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGetTopDMsForUserSince(t *testing.T) {
|
func TestGetTopDMsForUserSince(t *testing.T) {
|
||||||
t.Skip("MM-46911")
|
|
||||||
th := Setup(t).InitBasic()
|
th := Setup(t).InitBasic()
|
||||||
defer th.TearDown()
|
defer th.TearDown()
|
||||||
|
|
||||||
@@ -933,6 +932,7 @@ func TestGetTopDMsForUserSince(t *testing.T) {
|
|||||||
Username: GenerateTestUsername(),
|
Username: GenerateTestUsername(),
|
||||||
DisplayName: "a bot",
|
DisplayName: "a bot",
|
||||||
Description: "bot",
|
Description: "bot",
|
||||||
|
UserId: model.NewId(),
|
||||||
}
|
}
|
||||||
|
|
||||||
createdBot, resp, err := th.Client.CreateBot(bot)
|
createdBot, resp, err := th.Client.CreateBot(bot)
|
||||||
|
|||||||
@@ -2999,21 +2999,21 @@ func (s *SqlPostStore) updateThreadsFromPosts(transaction *sqlxTxWrapper, posts
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *SqlPostStore) GetTopDMsForUserSince(userID string, since int64, offset int, limit int) (*model.TopDMList, error) {
|
func (s *SqlPostStore) GetTopDMsForUserSince(userID string, since int64, offset int, limit int) (*model.TopDMList, error) {
|
||||||
var botsFilterExpr, stringSplitKeyword string
|
var botsFilterExpr string
|
||||||
if s.DriverName() == model.DatabaseDriverPostgres {
|
|
||||||
stringSplitKeyword = "split_part"
|
|
||||||
} else if s.DriverName() == model.DatabaseDriverMysql {
|
|
||||||
stringSplitKeyword = "SUBSTRING_INDEX"
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Channel.Name is of the format userId1__userId2.
|
Channel.Name is of the format userId1__userId2.
|
||||||
Using this, self dms, and bot dms can be filtered.
|
Using this, self dms, and bot dms can be filtered.
|
||||||
*/
|
*/
|
||||||
botsFilterExpr = fmt.Sprintf(`
|
if s.DriverName() == model.DatabaseDriverPostgres {
|
||||||
%s(Channels.Name, '__', 1) NOT IN (SELECT UserId FROM Bots)
|
botsFilterExpr = `SPLIT_PART(Channels.Name, '__', 1) NOT IN (SELECT UserId FROM Bots)
|
||||||
AND %s(Channels.Name, '__', 2) NOT IN (SELECT UserId FROM Bots)
|
AND SPLIT_PART(Channels.Name, '__', 2) NOT IN (SELECT UserId FROM Bots)
|
||||||
`, stringSplitKeyword, stringSplitKeyword)
|
`
|
||||||
|
} else if s.DriverName() == model.DatabaseDriverMysql {
|
||||||
|
botsFilterExpr = `SUBSTRING_INDEX(Channels.Name, '__', 1) NOT IN (SELECT UserId FROM Bots)
|
||||||
|
AND SUBSTRING_INDEX(Channels.Name, '__', -1) NOT IN (SELECT UserId FROM Bots)
|
||||||
|
`
|
||||||
|
}
|
||||||
|
|
||||||
channelSelector := s.getQueryBuilder().Select("Id", "TotalMsgCount").From("Channels").Join("ChannelMembers as cm on cm.ChannelId = Channels.Id").
|
channelSelector := s.getQueryBuilder().Select("Id", "TotalMsgCount").From("Channels").Join("ChannelMembers as cm on cm.ChannelId = Channels.Id").
|
||||||
Where(sq.And{
|
Where(sq.And{
|
||||||
sq.Expr("Channels.Type = 'D'"),
|
sq.Expr("Channels.Type = 'D'"),
|
||||||
|
|||||||
@@ -4067,6 +4067,8 @@ func testGetTopDMsForUserSince(t *testing.T, ss store.Store, s SqlStore) {
|
|||||||
u2 := model.User{Email: MakeEmail(), Username: model.NewId()}
|
u2 := model.User{Email: MakeEmail(), Username: model.NewId()}
|
||||||
u3 := model.User{Email: MakeEmail(), Username: model.NewId()}
|
u3 := model.User{Email: MakeEmail(), Username: model.NewId()}
|
||||||
u4 := model.User{Email: MakeEmail(), Username: model.NewId()}
|
u4 := model.User{Email: MakeEmail(), Username: model.NewId()}
|
||||||
|
u5 := model.User{Email: MakeEmail(), Username: model.NewId()}
|
||||||
|
|
||||||
_, err := ss.User().Save(&user)
|
_, err := ss.User().Save(&user)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
_, err = ss.User().Save(&u1)
|
_, err = ss.User().Save(&u1)
|
||||||
@@ -4077,6 +4079,17 @@ func testGetTopDMsForUserSince(t *testing.T, ss store.Store, s SqlStore) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
_, err = ss.User().Save(&u4)
|
_, err = ss.User().Save(&u4)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
_, err = ss.User().Save(&u5)
|
||||||
|
require.NoError(t, err)
|
||||||
|
bot := &model.Bot{
|
||||||
|
Username: "bot_user",
|
||||||
|
Description: "bot",
|
||||||
|
OwnerId: model.NewId(),
|
||||||
|
UserId: u5.Id,
|
||||||
|
}
|
||||||
|
|
||||||
|
savedBot, nErr := ss.Bot().Save(bot)
|
||||||
|
require.NoError(t, nErr)
|
||||||
// user direct messages
|
// user direct messages
|
||||||
chUser1, nErr := ss.Channel().CreateDirectChannel(&u1, &user)
|
chUser1, nErr := ss.Channel().CreateDirectChannel(&u1, &user)
|
||||||
require.NoError(t, nErr)
|
require.NoError(t, nErr)
|
||||||
@@ -4088,6 +4101,17 @@ func testGetTopDMsForUserSince(t *testing.T, ss store.Store, s SqlStore) {
|
|||||||
chUser3User4, nErr := ss.Channel().CreateDirectChannel(&u3, &u4)
|
chUser3User4, nErr := ss.Channel().CreateDirectChannel(&u3, &u4)
|
||||||
require.NoError(t, nErr)
|
require.NoError(t, nErr)
|
||||||
|
|
||||||
|
// bot direct message - should be ignored by top DMs
|
||||||
|
botUser, err := ss.User().Get(context.Background(), savedBot.UserId)
|
||||||
|
require.NoError(t, err)
|
||||||
|
chBot, nErr := ss.Channel().CreateDirectChannel(&user, botUser)
|
||||||
|
require.NoError(t, nErr)
|
||||||
|
_, err = ss.Post().Save(&model.Post{
|
||||||
|
ChannelId: chBot.Id,
|
||||||
|
UserId: botUser.Id,
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
// sample post data
|
// sample post data
|
||||||
// for u1
|
// for u1
|
||||||
_, err = ss.Post().Save(&model.Post{
|
_, err = ss.Post().Save(&model.Post{
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user