[MM-46603] P1 - Improvements in handling '0 posts' channels (#20905)

Automatic Merge
Этот коммит содержится в:
Shivashis Padhi
2022-09-09 23:04:00 +05:30
коммит произвёл GitHub
родитель 42e03e18b9
Коммит 38aaa9e3d3
6 изменённых файлов: 147 добавлений и 85 удалений

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

@@ -821,25 +821,68 @@ func TestGetTopInactiveChannelsForTeamSince(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
// delete offtopic channel - which interferes with 'least' active channel results // delete offtopic, town-square, th.basicchannel channel - which interferes with 'least' active channel results
offTopicChannel, appErr := th.App.GetChannelByName(th.Context, "off-topic", th.BasicTeam.Id, false) offTopicChannel, appErr := th.App.GetChannelByName(th.Context, "off-topic", th.BasicTeam.Id, false)
require.Nil(t, appErr, "Expected nil, didn't receive nil") require.Nil(t, appErr, "Expected nil, didn't receive nil")
appErr = th.App.PermanentDeleteChannel(th.Context, offTopicChannel) appErr = th.App.PermanentDeleteChannel(th.Context, offTopicChannel)
require.Nil(t, appErr) require.Nil(t, appErr)
townSquareChannel, appErr := th.App.GetChannelByName(th.Context, "town-square", th.BasicTeam.Id, false)
require.Nil(t, appErr, "Expected nil, didn't receive nil")
appErr = th.App.PermanentDeleteChannel(th.Context, townSquareChannel)
require.Nil(t, appErr)
basicChannel, appErr := th.App.GetChannel(th.Context, th.BasicChannel.Id)
require.Nil(t, appErr, "Expected nil, didn't receive nil")
appErr = th.App.PermanentDeleteChannel(th.Context, basicChannel)
require.Nil(t, appErr)
basicChannel2, appErr := th.App.GetChannel(th.Context, th.BasicChannel2.Id)
require.Nil(t, appErr, "Expected nil, didn't receive nil")
appErr = th.App.PermanentDeleteChannel(th.Context, basicChannel2)
require.Nil(t, appErr)
basicPrivateChannel, appErr := th.App.GetChannel(th.Context, th.BasicPrivateChannel.Id)
require.Nil(t, appErr, "Expected nil, didn't receive nil")
appErr = th.App.PermanentDeleteChannel(th.Context, basicPrivateChannel)
require.Nil(t, appErr)
th.App.Srv().SetLicense(model.NewTestLicenseSKU(model.LicenseShortSkuProfessional)) th.App.Srv().SetLicense(model.NewTestLicenseSKU(model.LicenseShortSkuProfessional))
client := th.Client client := th.Client
userId := th.BasicUser.Id userId := th.BasicUser.Id
channel4 := th.CreatePublicChannel() channel4Req := &model.Channel{
channel5 := th.CreatePrivateChannel() DisplayName: "channel4",
channel6 := th.CreatePrivateChannel() Name: GenerateTestChannelName(),
Type: model.ChannelTypeOpen,
TeamId: th.BasicTeam.Id,
CreateAt: 1,
}
channel4, _, err := client.CreateChannel(channel4Req)
require.NoError(t, err)
channel5Req := &model.Channel{
DisplayName: "channel4",
Name: GenerateTestChannelName(),
Type: model.ChannelTypePrivate,
TeamId: th.BasicTeam.Id,
CreateAt: 1,
}
channel5, _, err := client.CreateChannel(channel5Req)
require.NoError(t, err)
channel6Req := &model.Channel{
DisplayName: "channel4",
Name: GenerateTestChannelName(),
Type: model.ChannelTypePrivate,
TeamId: th.BasicTeam.Id,
CreateAt: 1,
}
channel6, _, err := client.CreateChannel(channel6Req)
require.NoError(t, err)
th.App.AddUserToChannel(th.Context, th.BasicUser, channel4, false) th.App.AddUserToChannel(th.Context, th.BasicUser, channel4, false)
th.App.AddUserToChannel(th.Context, th.BasicUser, channel5, false) th.App.AddUserToChannel(th.Context, th.BasicUser, channel5, false)
th.App.AddUserToChannel(th.Context, th.BasicUser, channel6, false) th.App.AddUserToChannel(th.Context, th.BasicUser, channel6, false)
channelIDs := [6]string{th.BasicChannel.Id, th.BasicChannel2.Id, th.BasicPrivateChannel.Id, channel4.Id, channel5.Id, channel6.Id} channelIDs := [3]string{channel4.Id, channel5.Id, channel6.Id}
i := len(channelIDs) i := len(channelIDs)
for _, channelID := range channelIDs { for _, channelID := range channelIDs {
@@ -859,22 +902,19 @@ func TestGetTopInactiveChannelsForTeamSince(t *testing.T) {
ID: channel6.Id, MessageCount: 1}, ID: channel6.Id, MessageCount: 1},
{ID: channel5.Id, MessageCount: 2}, {ID: channel5.Id, MessageCount: 2},
{ID: channel4.Id, MessageCount: 3}, {ID: channel4.Id, MessageCount: 3},
{ID: th.BasicPrivateChannel.Id, MessageCount: 4},
{ID: th.BasicChannel2.Id, MessageCount: 5},
{ID: th.BasicChannel.Id, MessageCount: 7},
} }
t.Run("get-top-inactive-channels-for-team-since", func(t *testing.T) { t.Run("get-top-inactive-channels-for-team-since", func(t *testing.T) {
topInactiveChannels, _, err := client.GetTopInactiveChannelsForTeamSince(teamId, model.TimeRangeToday, 0, 5) topInactiveChannels, _, err := client.GetTopInactiveChannelsForTeamSince(teamId, model.TimeRangeToday, 0, 2)
require.NoError(t, err) require.NoError(t, err)
for i, channel := range topInactiveChannels.Items { for i, channel := range topInactiveChannels.Items {
assert.Equal(t, expectedTopChannels[i].ID, channel.ID) assert.Equal(t, expectedTopChannels[i].ID, channel.ID)
} }
topInactiveChannels, _, err = client.GetTopInactiveChannelsForTeamSince(teamId, model.TimeRangeToday, 1, 5) topInactiveChannels, _, err = client.GetTopInactiveChannelsForTeamSince(teamId, model.TimeRangeToday, 1, 2)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, th.BasicChannel.Id, topInactiveChannels.Items[0].ID) assert.Equal(t, channel4.Id, topInactiveChannels.Items[0].ID)
}) })
t.Run("get-top-channels-for-user-since exclude channels user is not member of", func(t *testing.T) { t.Run("get-top-channels-for-user-since exclude channels user is not member of", func(t *testing.T) {
@@ -887,7 +927,7 @@ func TestGetTopInactiveChannelsForTeamSince(t *testing.T) {
th.RemoveUserFromChannel(th.BasicUser, excludedChannel) th.RemoveUserFromChannel(th.BasicUser, excludedChannel)
topInactiveChannels, _, err := client.GetTopInactiveChannelsForUserSince(teamId, model.TimeRangeToday, 0, 5) topInactiveChannels, _, err := client.GetTopInactiveChannelsForUserSince(teamId, model.TimeRangeToday, 0, 3)
require.NoError(t, err) require.NoError(t, err)
for i, channel := range topInactiveChannels.Items { for i, channel := range topInactiveChannels.Items {

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

@@ -2685,13 +2685,30 @@ func TestGetTopInactiveChannelsForTeamSince(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
channel2 := th.CreateChannel(th.Context, th.BasicTeam) channel2 := th.CreateChannel(th.Context, th.BasicTeam, WithCreateAt(1))
channel3 := th.CreateChannel(th.Context, th.BasicTeam, WithCreateAt(1))
channel4 := th.CreatePrivateChannel(th.Context, th.BasicTeam, WithCreateAt(1))
channel5 := th.CreateChannel(th.Context, th.BasicTeam, WithCreateAt(1))
channel6 := th.CreatePrivateChannel(th.Context, th.BasicTeam, WithCreateAt(1))
th.AddUserToChannel(th.BasicUser, channel2)
th.AddUserToChannel(th.BasicUser, channel3)
th.AddUserToChannel(th.BasicUser, channel4)
th.AddUserToChannel(th.BasicUser, channel5)
th.AddUserToChannel(th.BasicUser, channel6)
// delete offtopic channel - which interferes with 'least' active channel results // delete offtopic, town square, basicChannel channel - which interferes with 'least' active channel results
offTopicChannel, appErr := th.App.GetChannelByName(th.Context, "off-topic", th.BasicTeam.Id, false) offTopicChannel, appErr := th.App.GetChannelByName(th.Context, "off-topic", th.BasicTeam.Id, false)
require.Nil(t, appErr, "Expected nil, didn't receive nil") require.Nil(t, appErr, "Expected nil, didn't receive nil")
appErr = th.App.PermanentDeleteChannel(th.Context, offTopicChannel) appErr = th.App.PermanentDeleteChannel(th.Context, offTopicChannel)
require.Nil(t, appErr) require.Nil(t, appErr)
townSquareChannel, appErr := th.App.GetChannelByName(th.Context, "town-square", th.BasicTeam.Id, false)
require.Nil(t, appErr, "Expected nil, didn't receive nil")
appErr = th.App.PermanentDeleteChannel(th.Context, townSquareChannel)
require.Nil(t, appErr)
basicChannel, appErr := th.App.GetChannel(th.Context, th.BasicChannel.Id)
require.Nil(t, appErr, "Expected nil, didn't receive nil")
appErr = th.App.PermanentDeleteChannel(th.Context, basicChannel)
require.Nil(t, appErr)
// add a bot post to ensure it's counted // add a bot post to ensure it's counted
_, err := th.Server.Store.Post().Save(&model.Post{ _, err := th.Server.Store.Post().Save(&model.Post{
@@ -2704,8 +2721,6 @@ func TestGetTopInactiveChannelsForTeamSince(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
channel3 := th.CreatePrivateChannel(th.Context, th.BasicTeam)
// add a webhook post to ensure it's counted // add a webhook post to ensure it's counted
_, err = th.Server.Store.Post().Save(&model.Post{ _, err = th.Server.Store.Post().Save(&model.Post{
Message: "hello from a webhook", Message: "hello from a webhook",
@@ -2717,16 +2732,7 @@ func TestGetTopInactiveChannelsForTeamSince(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
channel4 := th.CreatePrivateChannel(th.Context, th.BasicTeam) channels := [5]*model.Channel{channel2, channel3, channel4, channel5, channel6}
channel5 := th.CreateChannel(th.Context, th.BasicTeam)
channel6 := th.CreatePrivateChannel(th.Context, th.BasicTeam)
th.AddUserToChannel(th.BasicUser, channel2)
th.AddUserToChannel(th.BasicUser, channel3)
th.AddUserToChannel(th.BasicUser, channel4)
th.AddUserToChannel(th.BasicUser, channel5)
th.AddUserToChannel(th.BasicUser, channel6)
channels := [6]*model.Channel{th.BasicChannel, channel2, channel3, channel4, channel5, channel6}
i := len(channels) i := len(channels)
for _, channel := range channels { for _, channel := range channels {
@@ -2745,13 +2751,12 @@ func TestGetTopInactiveChannelsForTeamSince(t *testing.T) {
{ID: channel4.Id, MessageCount: 3}, {ID: channel4.Id, MessageCount: 3},
{ID: channel3.Id, MessageCount: 5}, {ID: channel3.Id, MessageCount: 5},
{ID: channel2.Id, MessageCount: 6}, {ID: channel2.Id, MessageCount: 6},
{ID: th.BasicChannel.Id, MessageCount: 7},
} }
timeRange := model.StartOfDayForTimeRange(model.TimeRangeToday, time.Now().Location()) timeRange := model.StartOfDayForTimeRange(model.TimeRangeToday, time.Now().Location())
t.Run("get-top-channels-for-team-since", func(t *testing.T) { t.Run("get-top-channels-for-team-since", func(t *testing.T) {
topChannels, err := th.App.GetTopInactiveChannelsForTeamSince(th.Context, th.BasicChannel.TeamId, th.BasicUser.Id, &model.InsightsOpts{StartUnixMilli: timeRange.UnixMilli(), Page: 0, PerPage: 6}) topChannels, err := th.App.GetTopInactiveChannelsForTeamSince(th.Context, th.BasicChannel.TeamId, th.BasicUser.Id, &model.InsightsOpts{StartUnixMilli: timeRange.UnixMilli(), Page: 0, PerPage: 5})
require.Nil(t, err) require.Nil(t, err)
for i, channel := range topChannels.Items { for i, channel := range topChannels.Items {
@@ -2759,10 +2764,16 @@ func TestGetTopInactiveChannelsForTeamSince(t *testing.T) {
assert.Equal(t, expectedTopChannels[i].MessageCount, channel.MessageCount) assert.Equal(t, expectedTopChannels[i].MessageCount, channel.MessageCount)
} }
topChannels, err = th.App.GetTopInactiveChannelsForTeamSince(th.Context, th.BasicChannel.TeamId, th.BasicUser.Id, &model.InsightsOpts{StartUnixMilli: timeRange.UnixMilli(), Page: 1, PerPage: 5}) topChannels, err = th.App.GetTopInactiveChannelsForTeamSince(th.Context, th.BasicChannel.TeamId, th.BasicUser.Id, &model.InsightsOpts{StartUnixMilli: timeRange.UnixMilli(), Page: 1, PerPage: 4})
require.Nil(t, err) require.Nil(t, err)
assert.Equal(t, th.BasicChannel.Id, topChannels.Items[0].ID) assert.Equal(t, channel2.Id, topChannels.Items[0].ID)
assert.Equal(t, int64(7), topChannels.Items[0].MessageCount) assert.Equal(t, int64(6), topChannels.Items[0].MessageCount)
// it simulates channel being created recently
_ = th.CreatePrivateChannel(th.Context, th.BasicTeam)
topChannels, err = th.App.GetTopInactiveChannelsForTeamSince(th.Context, th.BasicChannel.TeamId, th.BasicUser.Id, &model.InsightsOpts{StartUnixMilli: timeRange.UnixMilli(), Page: 0, PerPage: 6})
require.Nil(t, err)
assert.Equal(t, 5, len(topChannels.Items))
}) })
} }
@@ -2770,13 +2781,21 @@ func TestGetTopInactiveChannelsForUserSince(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()
// delete offtopic channel - which interferes with 'least' active channel results // delete offtopic, town-square, th.basicchannel channels - which interferes with 'least' active channel results
offTopicChannel, appErr := th.App.GetChannelByName(th.Context, "off-topic", th.BasicTeam.Id, false) offTopicChannel, appErr := th.App.GetChannelByName(th.Context, "off-topic", th.BasicTeam.Id, false)
require.Nil(t, appErr, "Expected nil, didn't receive nil") require.Nil(t, appErr, "Expected nil, didn't receive nil")
appErr = th.App.PermanentDeleteChannel(th.Context, offTopicChannel) appErr = th.App.PermanentDeleteChannel(th.Context, offTopicChannel)
require.Nil(t, appErr) require.Nil(t, appErr)
townSquareChannel, appErr := th.App.GetChannelByName(th.Context, "town-square", th.BasicTeam.Id, false)
require.Nil(t, appErr, "Expected nil, didn't receive nil")
appErr = th.App.PermanentDeleteChannel(th.Context, townSquareChannel)
require.Nil(t, appErr)
basicChannel, appErr := th.App.GetChannel(th.Context, th.BasicChannel.Id)
require.Nil(t, appErr, "Expected nil, didn't receive nil")
appErr = th.App.PermanentDeleteChannel(th.Context, basicChannel)
require.Nil(t, appErr)
channel2 := th.CreateChannel(th.Context, th.BasicTeam) channel2 := th.CreateChannel(th.Context, th.BasicTeam, WithCreateAt(1))
// add a bot post to ensure it's counted // add a bot post to ensure it's counted
_, err := th.Server.Store.Post().Save(&model.Post{ _, err := th.Server.Store.Post().Save(&model.Post{
@@ -2789,7 +2808,7 @@ func TestGetTopInactiveChannelsForUserSince(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
channel3 := th.CreatePrivateChannel(th.Context, th.BasicTeam) channel3 := th.CreatePrivateChannel(th.Context, th.BasicTeam, WithCreateAt(1))
// add a webhook post to ensure it's counted // add a webhook post to ensure it's counted
_, err = th.Server.Store.Post().Save(&model.Post{ _, err = th.Server.Store.Post().Save(&model.Post{
@@ -2802,16 +2821,16 @@ func TestGetTopInactiveChannelsForUserSince(t *testing.T) {
}) })
require.NoError(t, err) require.NoError(t, err)
channel4 := th.CreatePrivateChannel(th.Context, th.BasicTeam) channel4 := th.CreatePrivateChannel(th.Context, th.BasicTeam, WithCreateAt(1))
channel5 := th.CreateChannel(th.Context, th.BasicTeam) channel5 := th.CreateChannel(th.Context, th.BasicTeam, WithCreateAt(1))
channel6 := th.CreatePrivateChannel(th.Context, th.BasicTeam) channel6 := th.CreatePrivateChannel(th.Context, th.BasicTeam, WithCreateAt(1))
th.AddUserToChannel(th.BasicUser, channel2) th.AddUserToChannel(th.BasicUser, channel2)
th.AddUserToChannel(th.BasicUser, channel3) th.AddUserToChannel(th.BasicUser, channel3)
th.AddUserToChannel(th.BasicUser, channel4) th.AddUserToChannel(th.BasicUser, channel4)
th.AddUserToChannel(th.BasicUser, channel5) th.AddUserToChannel(th.BasicUser, channel5)
th.AddUserToChannel(th.BasicUser, channel6) th.AddUserToChannel(th.BasicUser, channel6)
channels := [6]*model.Channel{th.BasicChannel, channel2, channel3, channel4, channel5, channel6} channels := [5]*model.Channel{channel2, channel3, channel4, channel5, channel6}
i := len(channels) i := len(channels)
for _, channel := range channels { for _, channel := range channels {
@@ -2830,24 +2849,23 @@ func TestGetTopInactiveChannelsForUserSince(t *testing.T) {
{ID: channel4.Id, MessageCount: 3}, {ID: channel4.Id, MessageCount: 3},
{ID: channel3.Id, MessageCount: 5}, {ID: channel3.Id, MessageCount: 5},
{ID: channel2.Id, MessageCount: 6}, {ID: channel2.Id, MessageCount: 6},
{ID: th.BasicChannel.Id, MessageCount: 7},
} }
timeRange := model.StartOfDayForTimeRange(model.TimeRangeToday, time.Now().Location()) timeRange := model.StartOfDayForTimeRange(model.TimeRangeToday, time.Now().Location())
t.Run("get-top-channels-for-user-since", func(t *testing.T) { t.Run("get-top-channels-for-user-since", func(t *testing.T) {
topChannels, err := th.App.GetTopInactiveChannelsForUserSince(th.Context, th.BasicChannel.TeamId, th.BasicUser.Id, &model.InsightsOpts{StartUnixMilli: timeRange.UnixMilli(), Page: 0, PerPage: 5}) topChannels, err := th.App.GetTopInactiveChannelsForUserSince(th.Context, th.BasicChannel.TeamId, th.BasicUser.Id, &model.InsightsOpts{StartUnixMilli: timeRange.UnixMilli(), Page: 0, PerPage: 4})
require.Nil(t, err) require.Nil(t, err)
require.Equal(t, len(topChannels.Items), 5) require.Equal(t, len(topChannels.Items), 4)
for i, channel := range topChannels.Items { for i, channel := range topChannels.Items {
assert.Equal(t, expectedTopChannels[i].ID, channel.ID) assert.Equal(t, expectedTopChannels[i].ID, channel.ID)
assert.Equal(t, expectedTopChannels[i].MessageCount, channel.MessageCount) assert.Equal(t, expectedTopChannels[i].MessageCount, channel.MessageCount)
} }
topChannels, err = th.App.GetTopInactiveChannelsForUserSince(th.Context, th.BasicChannel.TeamId, th.BasicUser.Id, &model.InsightsOpts{StartUnixMilli: timeRange.UnixMilli(), Page: 1, PerPage: 5}) topChannels, err = th.App.GetTopInactiveChannelsForUserSince(th.Context, th.BasicChannel.TeamId, th.BasicUser.Id, &model.InsightsOpts{StartUnixMilli: timeRange.UnixMilli(), Page: 1, PerPage: 4})
require.Nil(t, err) require.Nil(t, err)
require.Equal(t, len(topChannels.Items), 1) require.Equal(t, len(topChannels.Items), 1)
assert.Equal(t, th.BasicChannel.Id, topChannels.Items[0].ID) assert.Equal(t, channel2.Id, topChannels.Items[0].ID)
assert.Equal(t, int64(7), topChannels.Items[0].MessageCount) assert.Equal(t, int64(6), topChannels.Items[0].MessageCount)
}) })
} }

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

@@ -327,12 +327,18 @@ func WithShared(v bool) ChannelOption {
} }
} }
func WithCreateAt(v int64) ChannelOption {
return func(channel *model.Channel) {
channel.CreateAt = *model.NewInt64(v)
}
}
func (th *TestHelper) CreateChannel(c request.CTX, team *model.Team, options ...ChannelOption) *model.Channel { func (th *TestHelper) CreateChannel(c request.CTX, team *model.Team, options ...ChannelOption) *model.Channel {
return th.createChannel(c, team, model.ChannelTypeOpen, options...) return th.createChannel(c, team, model.ChannelTypeOpen, options...)
} }
func (th *TestHelper) CreatePrivateChannel(c request.CTX, team *model.Team) *model.Channel { func (th *TestHelper) CreatePrivateChannel(c request.CTX, team *model.Team, options ...ChannelOption) *model.Channel {
return th.createChannel(c, team, model.ChannelTypePrivate) return th.createChannel(c, team, model.ChannelTypePrivate, options...)
} }
func (th *TestHelper) createChannel(c request.CTX, team *model.Team, channelType model.ChannelType, options ...ChannelOption) *model.Channel { func (th *TestHelper) createChannel(c request.CTX, team *model.Team, channelType model.ChannelType, options ...ChannelOption) *model.Channel {

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

@@ -296,8 +296,9 @@ func (o *Channel) PreSave() {
o.Name = SanitizeUnicode(o.Name) o.Name = SanitizeUnicode(o.Name)
o.DisplayName = SanitizeUnicode(o.DisplayName) o.DisplayName = SanitizeUnicode(o.DisplayName)
if o.CreateAt == 0 {
o.CreateAt = GetMillis() o.CreateAt = GetMillis()
}
o.UpdateAt = o.CreateAt o.UpdateAt = o.CreateAt
o.ExtraUpdateAt = 0 o.ExtraUpdateAt = 0
} }

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

@@ -4337,48 +4337,45 @@ func (s SqlChannelStore) GetTopInactiveChannelsForTeamSince(teamID string, userI
LastActivityAt LastActivityAt
FROM FROM
((SELECT ((SELECT
Posts.ChannelId AS ID, PublicChannels.Id AS ID,
'O' AS Type, 'O' AS Type,
PublicChannels.DisplayName AS DisplayName, PublicChannels.DisplayName AS DisplayName,
PublicChannels.Name AS Name, PublicChannels.Name AS Name,
count(Posts.Id) AS MessageCount, COALESCE(count(Posts.Id), 0) AS MessageCount,
max(Posts.CreateAt) AS LastActivityAt COALESCE(max(Posts.CreateAt), 0) AS LastActivityAt
FROM FROM
Posts PublicChannels
LEFT JOIN PublicChannels on Posts.ChannelId = PublicChannels.Id LEFT JOIN Posts on Posts.ChannelId = PublicChannels.Id AND Posts.Type = '' AND Posts.CreateAt > ? AND Posts.DeleteAt = 0
LEFT JOIN Channels on Channels.Id = PublicChannels.Id
WHERE WHERE
Posts.DeleteAt = 0 PublicChannels.TeamId = ?
AND Posts.CreateAt > ?
AND (Posts.Type = '' OR Posts.Type = 'system_join_channel')
AND PublicChannels.TeamId = ?
AND PublicChannels.DeleteAt = 0 AND PublicChannels.DeleteAt = 0
AND Channels.CreateAt < ?
GROUP BY GROUP BY
Posts.ChannelId, PublicChannels.Id,
PublicChannels.DisplayName, PublicChannels.DisplayName,
PublicChannels.Name, PublicChannels.Name,
PublicChannels.TeamId) PublicChannels.TeamId)
UNION ALL UNION ALL
(SELECT (SELECT
Posts.ChannelId AS ID, Channels.Id AS ID,
Channels.Type AS Type, Channels.Type AS Type,
Channels.DisplayName AS DisplayName, Channels.DisplayName AS DisplayName,
Channels.Name AS Name, Channels.Name AS Name,
count(Posts.Id) AS MessageCount, COALESCE(count(Posts.Id), 0) AS MessageCount,
max(Posts.CreateAt) AS LastActivityAt COALESCE(max(Posts.CreateAt), 0) AS LastActivityAt
FROM FROM
Posts Channels
LEFT JOIN Channels on Posts.ChannelId = Channels.Id LEFT JOIN Posts on Posts.ChannelId = Channels.Id AND Posts.Type = '' AND Posts.CreateAt > ? AND Posts.DeleteAt = 0
LEFT JOIN ChannelMembers on Posts.ChannelId = ChannelMembers.ChannelId LEFT JOIN ChannelMembers on Posts.ChannelId = ChannelMembers.ChannelId
WHERE WHERE
Posts.DeleteAt = 0 Channels.TeamId = ?
AND Posts.CreateAt > ? AND Channels.CreateAt < ?
AND (Posts.Type = '' OR Posts.Type = 'system_join_channel')
AND Channels.TeamId = ?
AND Channels.Type = 'P' AND Channels.Type = 'P'
AND Channels.DeleteAt = 0 AND Channels.DeleteAt = 0
AND ChannelMembers.UserId = ? AND ChannelMembers.UserId = ?
GROUP BY GROUP BY
Posts.ChannelId, Channels.Id,
Channels.Type, Channels.Type,
Channels.DisplayName, Channels.DisplayName,
Channels.Name)) AS A Channels.Name)) AS A
@@ -4387,8 +4384,7 @@ func (s SqlChannelStore) GetTopInactiveChannelsForTeamSince(teamID string, userI
Name ASC Name ASC
LIMIT ? LIMIT ?
OFFSET ?` OFFSET ?`
args = append(args, since, teamID, since, teamID, userID, limit+1, offset) args = append(args, since, teamID, since, since, teamID, since, userID, limit+1, offset)
if err := s.GetReplicaX().Select(&channels, query, args...); err != nil { if err := s.GetReplicaX().Select(&channels, query, args...); err != nil {
return nil, errors.Wrap(err, "failed to get top Channels") return nil, errors.Wrap(err, "failed to get top Channels")
} }
@@ -4411,25 +4407,23 @@ func (s SqlChannelStore) GetTopInactiveChannelsForUserSince(teamID string, userI
query = ` query = `
SELECT SELECT
Posts.ChannelId AS ID, Channels.Id AS ID,
Channels.Type AS Type, Channels.Type AS Type,
Channels.DisplayName AS DisplayName, Channels.DisplayName AS DisplayName,
Channels.Name AS Name, Channels.Name AS Name,
count(Posts.Id) AS MessageCount, COALESCE(count(Posts.Id), 0) AS MessageCount,
max(Posts.CreateAt) AS LastActivityAt COALESCE(max(Posts.CreateAt), 0) AS LastActivityAt
FROM FROM
Posts Channels
LEFT JOIN Channels on Posts.ChannelId = Channels.Id LEFT JOIN Posts on Posts.ChannelId = Channels.Id AND Posts.Type = '' AND Posts.CreateAt > ? AND Posts.DeleteAt = 0
LEFT JOIN ChannelMembers on Posts.ChannelId = ChannelMembers.ChannelId LEFT JOIN ChannelMembers on Posts.ChannelId = ChannelMembers.ChannelId
WHERE WHERE
Posts.DeleteAt = 0 Channels.DeleteAt = 0
AND Posts.CreateAt > ? AND Channels.CreateAt < ?
AND (Posts.Type = '' OR Posts.Type = 'system_join_channel')
AND Channels.DeleteAt = 0
AND (Channels.Type = 'O' OR Channels.Type = 'P') AND (Channels.Type = 'O' OR Channels.Type = 'P')
AND ChannelMembers.UserId = ? ` AND ChannelMembers.UserId = ? `
args = []any{since, userID} args = []any{since, since, userID}
if teamID != "" { if teamID != "" {
query += ` query += `
@@ -4439,7 +4433,7 @@ func (s SqlChannelStore) GetTopInactiveChannelsForUserSince(teamID string, userI
query += ` query += `
Group By Group By
Posts.ChannelId, Channels.Id,
Channels.Type, Channels.Type,
Channels.DisplayName, Channels.DisplayName,
Channels.Name Channels.Name

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

@@ -7978,6 +7978,7 @@ func testGetTopInactiveChannels(t *testing.T, ss store.Store) {
DisplayName: "test_share_flag asdf", DisplayName: "test_share_flag asdf",
Name: "test_share_flag_public0", Name: "test_share_flag_public0",
Type: model.ChannelTypeOpen, Type: model.ChannelTypeOpen,
CreateAt: 1,
} }
channelSaved0, err := ss.Channel().Save(channelPublic0, 999) channelSaved0, err := ss.Channel().Save(channelPublic0, 999)
@@ -7989,6 +7990,7 @@ func testGetTopInactiveChannels(t *testing.T, ss store.Store) {
DisplayName: "test_share_flag", DisplayName: "test_share_flag",
Name: "test_share_flag", Name: "test_share_flag",
Type: model.ChannelTypeOpen, Type: model.ChannelTypeOpen,
CreateAt: 1,
} }
channelSaved1, err := ss.Channel().Save(channelPublic1, 999) channelSaved1, err := ss.Channel().Save(channelPublic1, 999)
@@ -8001,6 +8003,7 @@ func testGetTopInactiveChannels(t *testing.T, ss store.Store) {
c3.DisplayName = "Channel3" + model.NewId() c3.DisplayName = "Channel3" + model.NewId()
c3.Name = NewTestId() c3.Name = NewTestId()
c3.Type = model.ChannelTypePrivate c3.Type = model.ChannelTypePrivate
c3.CreateAt = 1
channelPrivate, nErr := ss.Channel().Save(&c3, -1) channelPrivate, nErr := ss.Channel().Save(&c3, -1)
require.NoError(t, nErr) require.NoError(t, nErr)
@@ -8080,7 +8083,7 @@ func testGetTopInactiveChannels(t *testing.T, ss store.Store) {
// for u1 // for u1
t.Run("top inactive channels for team - u1 ", func(t *testing.T) { t.Run("top inactive channels for team - u1 ", func(t *testing.T) {
topInactiveChannels, err := ss.Channel().GetTopInactiveChannelsForTeamSince(team.Id, u1.Id, 0, 0, 10) topInactiveChannels, err := ss.Channel().GetTopInactiveChannelsForTeamSince(team.Id, u1.Id, 2, 0, 10)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, topInactiveChannels.Items, 3) require.Len(t, topInactiveChannels.Items, 3)
require.Equal(t, topInactiveChannels.Items[0].ID, channelSaved0.Id) require.Equal(t, topInactiveChannels.Items[0].ID, channelSaved0.Id)
@@ -8096,7 +8099,7 @@ func testGetTopInactiveChannels(t *testing.T, ss store.Store) {
}) })
t.Run("top inactive channels for user - u1 ", func(t *testing.T) { t.Run("top inactive channels for user - u1 ", func(t *testing.T) {
topInactiveChannels, err := ss.Channel().GetTopInactiveChannelsForUserSince(team.Id, u1.Id, 0, 0, 10) topInactiveChannels, err := ss.Channel().GetTopInactiveChannelsForUserSince(team.Id, u1.Id, 2, 0, 10)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, topInactiveChannels.Items, 2) require.Len(t, topInactiveChannels.Items, 2)
require.Equal(t, topInactiveChannels.Items[0].ID, channelPrivate.Id) require.Equal(t, topInactiveChannels.Items[0].ID, channelPrivate.Id)
@@ -8105,7 +8108,7 @@ func testGetTopInactiveChannels(t *testing.T, ss store.Store) {
// for u2 // for u2
t.Run("top inactive channels for team - u2 ", func(t *testing.T) { t.Run("top inactive channels for team - u2 ", func(t *testing.T) {
topInactiveChannels, err := ss.Channel().GetTopInactiveChannelsForTeamSince(team.Id, u2.Id, 0, 0, 10) topInactiveChannels, err := ss.Channel().GetTopInactiveChannelsForTeamSince(team.Id, u2.Id, 2, 0, 10)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, topInactiveChannels.Items, 2) require.Len(t, topInactiveChannels.Items, 2)
require.Equal(t, topInactiveChannels.Items[0].ID, channelSaved0.Id) require.Equal(t, topInactiveChannels.Items[0].ID, channelSaved0.Id)
@@ -8114,7 +8117,7 @@ func testGetTopInactiveChannels(t *testing.T, ss store.Store) {
}) })
t.Run("top inactive channels for user - u2 ", func(t *testing.T) { t.Run("top inactive channels for user - u2 ", func(t *testing.T) {
topInactiveChannels, err := ss.Channel().GetTopInactiveChannelsForUserSince(team.Id, u2.Id, 0, 0, 10) topInactiveChannels, err := ss.Channel().GetTopInactiveChannelsForUserSince(team.Id, u2.Id, 2, 0, 10)
require.NoError(t, err) require.NoError(t, err)
require.Len(t, topInactiveChannels.Items, 1) require.Len(t, topInactiveChannels.Items, 1)
require.Equal(t, topInactiveChannels.Items[0].ID, channelPublic0.Id) require.Equal(t, topInactiveChannels.Items[0].ID, channelPublic0.Id)