MM-46911: P1 - Fix MySQL query to filter bots out of TopDM (#20965)

Automatic Merge
Этот коммит содержится в:
Shivashis Padhi
2022-09-09 21:04:00 +05:30
коммит произвёл GitHub
родитель 78251a3ff1
Коммит 8b328386c5
3 изменённых файлов: 36 добавлений и 12 удалений

Просмотреть файл

@@ -897,7 +897,6 @@ func TestGetTopInactiveChannelsForTeamSince(t *testing.T) {
}
func TestGetTopDMsForUserSince(t *testing.T) {
t.Skip("MM-46911")
th := Setup(t).InitBasic()
defer th.TearDown()
@@ -933,6 +932,7 @@ func TestGetTopDMsForUserSince(t *testing.T) {
Username: GenerateTestUsername(),
DisplayName: "a bot",
Description: "bot",
UserId: model.NewId(),
}
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) {
var botsFilterExpr, stringSplitKeyword string
if s.DriverName() == model.DatabaseDriverPostgres {
stringSplitKeyword = "split_part"
} else if s.DriverName() == model.DatabaseDriverMysql {
stringSplitKeyword = "SUBSTRING_INDEX"
}
var botsFilterExpr string
/*
Channel.Name is of the format userId1__userId2.
Using this, self dms, and bot dms can be filtered.
*/
botsFilterExpr = fmt.Sprintf(`
%s(Channels.Name, '__', 1) NOT IN (SELECT UserId FROM Bots)
AND %s(Channels.Name, '__', 2) NOT IN (SELECT UserId FROM Bots)
`, stringSplitKeyword, stringSplitKeyword)
if s.DriverName() == model.DatabaseDriverPostgres {
botsFilterExpr = `SPLIT_PART(Channels.Name, '__', 1) NOT IN (SELECT UserId FROM Bots)
AND SPLIT_PART(Channels.Name, '__', 2) NOT IN (SELECT UserId FROM Bots)
`
} 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").
Where(sq.And{
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()}
u3 := 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)
require.NoError(t, err)
_, err = ss.User().Save(&u1)
@@ -4077,6 +4079,17 @@ func testGetTopDMsForUserSince(t *testing.T, ss store.Store, s SqlStore) {
require.NoError(t, err)
_, err = ss.User().Save(&u4)
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
chUser1, nErr := ss.Channel().CreateDirectChannel(&u1, &user)
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)
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
// for u1
_, err = ss.Post().Save(&model.Post{