[MM-56399][MM-56397][MM-56456][MM-56269] Various changes for user reporting for admins (#25839)
* [MM-56399] Add user count endpoint for reporting * [MM-56397] Added search term to user report filter * Missing translation * [MM-56456] Rename up/down to prev/next for reporting cursoring * [MM-56269] Add DeleteAt, MfaActive and AuthService fields to UserReport * PR feedback * Fix test --------- Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
bb88b92b4c
Коммит
0a4e9eeb92
@@ -2268,12 +2268,56 @@ func (us SqlUserStore) RefreshPostStatsForUsers() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func applyUserReportFilter(query sq.SelectBuilder, filter *model.UserReportOptions, isPostgres bool) sq.SelectBuilder {
|
||||
query = applyRoleFilter(query, filter.Role, isPostgres)
|
||||
if filter.HasNoTeam {
|
||||
query = query.Where(sq.Expr("u.Id NOT IN (SELECT UserId FROM TeamMembers WHERE DeleteAt = 0)"))
|
||||
} else if filter.Team != "" {
|
||||
query = query.Join("TeamMembers tm ON (tm.UserId = u.Id AND tm.DeleteAt = 0)").
|
||||
Where(sq.Eq{"tm.TeamId": filter.Team})
|
||||
}
|
||||
if filter.HideActive {
|
||||
query = query.Where(sq.Gt{"u.DeleteAt": 0})
|
||||
}
|
||||
if filter.HideInactive {
|
||||
query = query.Where(sq.Eq{"u.DeleteAt": 0})
|
||||
}
|
||||
|
||||
if strings.TrimSpace(filter.SearchTerm) != "" {
|
||||
query = generateSearchQuery(query, strings.Fields(sanitizeSearchTerm(filter.SearchTerm, "*")), UserSearchTypeAll, isPostgres)
|
||||
}
|
||||
|
||||
return query
|
||||
}
|
||||
|
||||
func (us SqlUserStore) GetUserCountForReport(filter *model.UserReportOptions) (int64, error) {
|
||||
isPostgres := us.DriverName() == model.DatabaseDriverPostgres
|
||||
query := us.getQueryBuilder().
|
||||
Select("COUNT(u.Id)").
|
||||
From("Users u")
|
||||
|
||||
if isPostgres {
|
||||
query = query.LeftJoin("Bots ON u.Id = Bots.UserId").Where("Bots.UserId IS NULL")
|
||||
} else {
|
||||
query = query.Where(sq.Expr("u.Id NOT IN (SELECT UserId FROM Bots)"))
|
||||
}
|
||||
|
||||
query = applyUserReportFilter(query, filter, isPostgres)
|
||||
queryStr, args, err := query.ToSql()
|
||||
if err != nil {
|
||||
return 0, errors.Wrap(err, "user_count_report_tosql")
|
||||
}
|
||||
var v int64
|
||||
err = us.GetReplicaX().Get(&v, queryStr, args...)
|
||||
if err != nil {
|
||||
return 0, errors.Wrap(err, "failed to count Users for report")
|
||||
}
|
||||
return v, nil
|
||||
}
|
||||
|
||||
func (us SqlUserStore) GetUserReport(filter *model.UserReportOptions) ([]*model.UserReportQuery, error) {
|
||||
isPostgres := us.DriverName() == model.DatabaseDriverPostgres
|
||||
selectColumns := []string{"u.Id", "u.LastLogin", "MAX(s.LastActivityAt) AS LastStatusAt"}
|
||||
for _, column := range model.UserReportSortColumns {
|
||||
selectColumns = append(selectColumns, "u."+column)
|
||||
}
|
||||
selectColumns := []string{"u.*", "MAX(s.LastActivityAt) AS LastStatusAt"}
|
||||
if isPostgres {
|
||||
selectColumns = append(selectColumns,
|
||||
"MAX(ps.LastPostDate) AS LastPostDate",
|
||||
@@ -2303,7 +2347,7 @@ func (us SqlUserStore) GetUserReport(filter *model.UserReportOptions) ([]*model.
|
||||
// no need to apply any filtering and pagination if there are no
|
||||
// previous element ID and value provided.
|
||||
if filter.FromId != "" && filter.FromColumnValue != "" {
|
||||
if (filter.Direction == "up" && !filter.SortDesc) || (filter.Direction == "down" && filter.SortDesc) {
|
||||
if (filter.Direction == "prev" && !filter.SortDesc) || (filter.Direction == "next" && filter.SortDesc) {
|
||||
sortDirection = "DESC"
|
||||
|
||||
query = query.Where(sq.Or{
|
||||
@@ -2364,19 +2408,7 @@ func (us SqlUserStore) GetUserReport(filter *model.UserReportOptions) ([]*model.
|
||||
}
|
||||
}
|
||||
|
||||
query = applyRoleFilter(query, filter.Role, isPostgres)
|
||||
if filter.HasNoTeam {
|
||||
query = query.Where(sq.Expr("u.Id NOT IN (SELECT UserId FROM TeamMembers WHERE DeleteAt = 0)"))
|
||||
} else if filter.Team != "" {
|
||||
query = query.Join("TeamMembers tm ON (tm.UserId = u.Id AND tm.DeleteAt = 0)").
|
||||
Where(sq.Eq{"tm.TeamId": filter.Team})
|
||||
}
|
||||
if filter.HideActive {
|
||||
query = query.Where(sq.Gt{"u.DeleteAt": 0})
|
||||
}
|
||||
if filter.HideInactive {
|
||||
query = query.Where(sq.Eq{"u.DeleteAt": 0})
|
||||
}
|
||||
query = applyUserReportFilter(query, filter, isPostgres)
|
||||
|
||||
parentQuery := query
|
||||
// If we're going a page back...
|
||||
@@ -2384,7 +2416,7 @@ func (us SqlUserStore) GetUserReport(filter *model.UserReportOptions) ([]*model.
|
||||
// The way pagination works, we get the previous page's rows
|
||||
// in reverse order. So, we use parent query on it to
|
||||
// reverse the order in database itself.
|
||||
if filter.Direction == "up" {
|
||||
if filter.Direction == "prev" {
|
||||
reverseSortDirection := "ASC"
|
||||
if sortDirection == "ASC" {
|
||||
reverseSortDirection = "DESC"
|
||||
|
||||
Ссылка в новой задаче
Block a user