[MM-46692] Channel group member count (#21270)
* tools updates * Revert "tools updates" This reverts commit 6293297b55803c5a263e200ebd80192899666ae9. * adding channel member count to groups request * fixing models * adding a new test * removing unused var Co-authored-by: Benjamin Cooke <benjamincooke@Benjamins-MacBook-Pro.local> Co-authored-by: Benjamin Cooke <benjamincooke@Benjamins-MBP.ht.home> Co-authored-by: Benjamin Cooke <benjamincooke@Benjamins-MBP.fritz.box> Co-authored-by: Benjamin Cooke <benjamincooke@Benjamins-MacBook-Pro.fritz.box> Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
@@ -1056,34 +1056,38 @@ func (s *SqlGroupStore) CountGroupsByChannel(channelId string, opts model.GroupS
|
||||
}
|
||||
|
||||
type group struct {
|
||||
Id string
|
||||
Name *string
|
||||
DisplayName string
|
||||
Description string
|
||||
Source model.GroupSource
|
||||
RemoteId *string
|
||||
CreateAt int64
|
||||
UpdateAt int64
|
||||
DeleteAt int64
|
||||
HasSyncables bool
|
||||
MemberCount *int
|
||||
AllowReference bool
|
||||
Id string
|
||||
Name *string
|
||||
DisplayName string
|
||||
Description string
|
||||
Source model.GroupSource
|
||||
RemoteId *string
|
||||
CreateAt int64
|
||||
UpdateAt int64
|
||||
DeleteAt int64
|
||||
HasSyncables bool
|
||||
MemberCount *int
|
||||
AllowReference bool
|
||||
ChannelMemberCount *int
|
||||
ChannelMemberTimezonesCount *int
|
||||
}
|
||||
|
||||
func (g group) ToModel() *model.Group {
|
||||
return &model.Group{
|
||||
Id: g.Id,
|
||||
Name: g.Name,
|
||||
DisplayName: g.DisplayName,
|
||||
Description: g.Description,
|
||||
Source: g.Source,
|
||||
RemoteId: g.RemoteId,
|
||||
CreateAt: g.CreateAt,
|
||||
UpdateAt: g.UpdateAt,
|
||||
DeleteAt: g.DeleteAt,
|
||||
HasSyncables: g.HasSyncables,
|
||||
AllowReference: g.AllowReference,
|
||||
MemberCount: g.MemberCount,
|
||||
Id: g.Id,
|
||||
Name: g.Name,
|
||||
DisplayName: g.DisplayName,
|
||||
Description: g.Description,
|
||||
Source: g.Source,
|
||||
RemoteId: g.RemoteId,
|
||||
CreateAt: g.CreateAt,
|
||||
UpdateAt: g.UpdateAt,
|
||||
DeleteAt: g.DeleteAt,
|
||||
HasSyncables: g.HasSyncables,
|
||||
AllowReference: g.AllowReference,
|
||||
MemberCount: g.MemberCount,
|
||||
ChannelMemberCount: g.ChannelMemberCount,
|
||||
ChannelMemberTimezonesCount: g.ChannelMemberTimezonesCount,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1416,7 +1420,20 @@ func (s *SqlGroupStore) GetGroupsAssociatedToChannelsByTeam(teamId string, opts
|
||||
func (s *SqlGroupStore) GetGroups(page, perPage int, opts model.GroupSearchOpts, viewRestrictions *model.ViewUsersRestrictions) ([]*model.Group, error) {
|
||||
groupsVar := groups{}
|
||||
|
||||
groupsQuery := s.getQueryBuilder().Select("g.*")
|
||||
selectQuery := []string{"g.*"}
|
||||
|
||||
if opts.IncludeMemberCount {
|
||||
selectQuery = append(selectQuery, "coalesce(Members.MemberCount, 0) AS MemberCount")
|
||||
}
|
||||
|
||||
if opts.IncludeChannelMemberCount != "" {
|
||||
selectQuery = append(selectQuery, "coalesce(ChannelMembers.ChannelMemberCount, 0) AS ChannelMemberCount")
|
||||
if opts.IncludeTimezones {
|
||||
selectQuery = append(selectQuery, "coalesce(ChannelMembers.ChannelMemberTimezonesCount, 0) AS ChannelMemberTimezonesCount")
|
||||
}
|
||||
}
|
||||
|
||||
groupsQuery := s.getQueryBuilder().Select(strings.Join(selectQuery, ", "))
|
||||
|
||||
if opts.IncludeMemberCount {
|
||||
countQuery := s.getQueryBuilder().
|
||||
@@ -1433,12 +1450,43 @@ func (s *SqlGroupStore) GetGroups(page, perPage int, opts model.GroupSearchOpts,
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "get_groups_tosql")
|
||||
}
|
||||
|
||||
groupsQuery = s.getQueryBuilder().
|
||||
Select("g.*, coalesce(Members.MemberCount, 0) AS MemberCount").
|
||||
groupsQuery = groupsQuery.
|
||||
LeftJoin("("+countString+") AS Members ON Members.GroupId = g.Id", params...)
|
||||
}
|
||||
|
||||
if opts.IncludeChannelMemberCount != "" {
|
||||
selectStr := "GroupMembers.GroupId, COUNT(ChannelMembers.UserId) AS ChannelMemberCount"
|
||||
joinStr := ""
|
||||
|
||||
if opts.IncludeTimezones {
|
||||
if s.DriverName() == model.DatabaseDriverMysql {
|
||||
selectStr += `,
|
||||
COUNT(DISTINCT
|
||||
(
|
||||
CASE WHEN JSON_EXTRACT(Timezone, '$.useAutomaticTimezone') = 'true' AND LENGTH(JSON_UNQUOTE(JSON_EXTRACT(Timezone, '$.automaticTimezone'))) > 0
|
||||
THEN JSON_EXTRACT(Timezone, '$.automaticTimezone')
|
||||
WHEN JSON_EXTRACT(Timezone, '$.useAutomaticTimezone') = 'false' AND LENGTH(JSON_UNQUOTE(JSON_EXTRACT(Timezone, '$.manualTimezone'))) > 0
|
||||
THEN JSON_EXTRACT(Timezone, '$.manualTimezone')
|
||||
END
|
||||
)) AS ChannelMemberTimezonesCount`
|
||||
} else if s.DriverName() == model.DatabaseDriverPostgres {
|
||||
selectStr += `,
|
||||
COUNT(DISTINCT
|
||||
(
|
||||
CASE WHEN Timezone->>'useAutomaticTimezone' = 'true' AND length(Timezone->>'automaticTimezone') > 0
|
||||
THEN Timezone->>'automaticTimezone'
|
||||
WHEN Timezone->>'useAutomaticTimezone' = 'false' AND length(Timezone->>'manualTimezone') > 0
|
||||
THEN Timezone->>'manualTimezone'
|
||||
END
|
||||
)) AS ChannelMemberTimezonesCount`
|
||||
}
|
||||
joinStr = "LEFT JOIN Users ON Users.Id = GroupMembers.UserId"
|
||||
}
|
||||
|
||||
groupsQuery = groupsQuery.
|
||||
LeftJoin("(SELECT "+selectStr+" FROM ChannelMembers LEFT JOIN GroupMembers ON GroupMembers.UserId = ChannelMembers.UserId AND GroupMembers.DeleteAt = 0 "+joinStr+" WHERE ChannelMembers.ChannelId = ? GROUP BY GroupId) AS ChannelMembers ON ChannelMembers.GroupId = g.Id", opts.IncludeChannelMemberCount)
|
||||
}
|
||||
|
||||
if opts.FilterHasMember != "" {
|
||||
groupsQuery = groupsQuery.
|
||||
LeftJoin("GroupMembers ON GroupMembers.GroupId = g.Id").
|
||||
|
||||
Ссылка в новой задаче
Block a user