diff --git a/store/sqlstore/channel_store.go b/store/sqlstore/channel_store.go index c5646cee3e..7ea32fda1f 100644 --- a/store/sqlstore/channel_store.go +++ b/store/sqlstore/channel_store.go @@ -1811,7 +1811,27 @@ func (s SqlChannelStore) GetMemberCountsByGroup(channelID string, includeTimezon selectStr := "GroupMembers.GroupId, COUNT(ChannelMembers.UserId) AS ChannelMemberCount" if includeTimezones { - selectStr = "GroupMembers.GroupId, COUNT(ChannelMembers.UserId) AS ChannelMemberCount, COUNT( DISTINCT Users.Timezone ) AS ChannelMemberTimezonesCount" + distinctTimezones := ` + DISTINCT( + CASE WHEN JSON_EXTRACT(Timezone, '$.useAutomaticTimezone') = 'true' AND LENGTH(Timezone) > 74 + THEN JSON_EXTRACT(Timezone, '$.automaticTimezone') + WHEN LENGTH(Timezone) > 74 + THEN JSON_EXTRACT(Timezone, '$.manualTimezone') + END + ) + ` + if s.DriverName() == model.DATABASE_DRIVER_POSTGRES { + distinctTimezones = ` + DISTINCT( + CASE WHEN Timezone::json->>'useAutomaticTimezone' = 'true' AND LENGTH(Timezone) > 74 + THEN Timezone::json->>'automaticTimezone' + WHEN LENGTH(Timezone) > 74 + THEN Timezone::json->>'manualTimezone' + END + ) + ` + } + selectStr = `GroupMembers.GroupId, COUNT(ChannelMembers.UserId) AS ChannelMemberCount, COUNT(` + distinctTimezones + `) AS ChannelMemberTimezonesCount` } query := s.getQueryBuilder(). diff --git a/store/storetest/channel_store.go b/store/storetest/channel_store.go index c7f4227a54..22e364ee34 100644 --- a/store/storetest/channel_store.go +++ b/store/storetest/channel_store.go @@ -18,6 +18,7 @@ import ( "github.com/mattermost/mattermost-server/v5/model" "github.com/mattermost/mattermost-server/v5/services/timezones" "github.com/mattermost/mattermost-server/v5/store" + "github.com/mattermost/mattermost-server/v5/utils" ) type SqlSupplier interface { @@ -4335,13 +4336,13 @@ func testGetMemberCountsByGroup(t *testing.T, ss store.Store) { require.Equal(t, expectedMemberCounts, memberCounts) }) - t.Run("returns memberCountsByGroup with timezones", func(t *testing.T) { + t.Run("returns memberCountsByGroup with timezones when no timezones set", func(t *testing.T) { memberCounts, err = ss.Channel().GetMemberCountsByGroup(c1.Id, true) expectedMemberCounts := []*model.ChannelMemberCountByGroup{ { GroupId: g1.Id, ChannelMemberCount: 1, - ChannelMemberTimezonesCount: 1, + ChannelMemberTimezonesCount: 0, }, } require.Nil(t, err) @@ -4362,6 +4363,7 @@ func testGetMemberCountsByGroup(t *testing.T, ss store.Store) { timeZone := timezones.DefaultUserTimezone() if i == 1 { timeZone["manualTimezone"] = "EDT" + timeZone["useAutomaticTimezone"] = "false" } u := &model.User{ @@ -4399,10 +4401,20 @@ func testGetMemberCountsByGroup(t *testing.T, ss store.Store) { // create 10 different users with 3 different timezones for group 3 for i := 1; i <= 10; i++ { timeZone := timezones.DefaultUserTimezone() - if i == 1 { + + if i == 1 || i == 2 { timeZone["manualTimezone"] = "EDT" - } else if i == 2 { + timeZone["useAutomaticTimezone"] = "false" + } else if i == 3 || i == 4 { timeZone["manualTimezone"] = "PST" + timeZone["useAutomaticTimezone"] = "false" + } else if i == 5 || i == 6 { + timeZone["autoTimezone"] = "PST" + timeZone["useAutomaticTimezone"] = "true" + } else { + // Give every user with auto timezone set to true a random manual timezone to ensure that manual timezone is not looked at if auto is set + timeZone["useAutomaticTimezone"] = "true" + timeZone["manualTimezone"] = "PST" + utils.RandomName(utils.Range{Begin: 5, End: 5}, utils.ALPHANUMERIC) } u := &model.User{ @@ -4456,12 +4468,12 @@ func testGetMemberCountsByGroup(t *testing.T, ss store.Store) { { GroupId: g1.Id, ChannelMemberCount: 1, - ChannelMemberTimezonesCount: 1, + ChannelMemberTimezonesCount: 0, }, { GroupId: g2.Id, ChannelMemberCount: 5, - ChannelMemberTimezonesCount: 2, + ChannelMemberTimezonesCount: 1, }, { GroupId: g3.Id,