Fixed user reporting pagination (#25780)
* Fixed pagination and sorting for Postgres * Updated tests
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
39b2ecf2dd
Коммит
9016e30044
@@ -2288,9 +2288,9 @@ func (us SqlUserStore) GetUserReport(filter *model.UserReportOptions) ([]*model.
|
||||
)
|
||||
}
|
||||
|
||||
sortColumnValue := filter.SortColumn
|
||||
sortDirection := "ASC"
|
||||
if filter.SortDesc {
|
||||
sortColumnValue += " DESC"
|
||||
sortDirection = "DESC"
|
||||
}
|
||||
|
||||
query := us.getQueryBuilder().
|
||||
@@ -2298,27 +2298,36 @@ func (us SqlUserStore) GetUserReport(filter *model.UserReportOptions) ([]*model.
|
||||
From("Users u").
|
||||
LeftJoin("Status s ON s.UserId = u.Id").
|
||||
Where(sq.Expr("u.Id NOT IN (SELECT UserId FROM Bots)")).
|
||||
GroupBy("u.Id").
|
||||
OrderBy(sortColumnValue, "u.Id")
|
||||
GroupBy("u.Id")
|
||||
|
||||
if (filter.Direction == "up" && !filter.SortDesc) || (filter.Direction == "down" && filter.SortDesc) {
|
||||
query = query.Where(sq.Or{
|
||||
sq.Lt{filter.SortColumn: filter.FromColumnValue},
|
||||
sq.And{
|
||||
sq.Eq{filter.SortColumn: filter.FromColumnValue},
|
||||
sq.Lt{"u.Id": filter.FromId},
|
||||
},
|
||||
})
|
||||
} else {
|
||||
query = query.Where(sq.Or{
|
||||
sq.Gt{filter.SortColumn: filter.FromColumnValue},
|
||||
sq.And{
|
||||
sq.Eq{filter.SortColumn: filter.FromColumnValue},
|
||||
sq.Gt{"u.Id": filter.FromId},
|
||||
},
|
||||
})
|
||||
// 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) {
|
||||
sortDirection = "DESC"
|
||||
|
||||
query = query.Where(sq.Or{
|
||||
sq.Lt{filter.SortColumn: filter.FromColumnValue},
|
||||
sq.And{
|
||||
sq.Eq{filter.SortColumn: filter.FromColumnValue},
|
||||
sq.Lt{"u.Id": filter.FromId},
|
||||
},
|
||||
})
|
||||
} else {
|
||||
sortDirection = "ASC"
|
||||
|
||||
query = query.Where(sq.Or{
|
||||
sq.Gt{filter.SortColumn: filter.FromColumnValue},
|
||||
sq.And{
|
||||
sq.Eq{filter.SortColumn: filter.FromColumnValue},
|
||||
sq.Gt{"u.Id": filter.FromId},
|
||||
},
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
query = query.OrderBy(filter.SortColumn+" "+sortDirection, "u.Id")
|
||||
|
||||
if filter.PageSize > 0 {
|
||||
query = query.Limit(uint64(filter.PageSize))
|
||||
}
|
||||
@@ -2369,8 +2378,26 @@ func (us SqlUserStore) GetUserReport(filter *model.UserReportOptions) ([]*model.
|
||||
query = query.Where(sq.Eq{"u.DeleteAt": 0})
|
||||
}
|
||||
|
||||
parentQuery := query
|
||||
// If we're going a page back...
|
||||
//
|
||||
// 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" {
|
||||
reverseSortDirection := "ASC"
|
||||
if sortDirection == "ASC" {
|
||||
reverseSortDirection = "DESC"
|
||||
}
|
||||
|
||||
parentQuery = us.getQueryBuilder().
|
||||
Select("*").
|
||||
FromSelect(query, "data").
|
||||
OrderBy(filter.SortColumn+" "+reverseSortDirection, "Id")
|
||||
}
|
||||
|
||||
userResults := []*model.UserReportQuery{}
|
||||
err := us.GetReplicaX().SelectBuilder(&userResults, query)
|
||||
err := us.GetReplicaX().SelectBuilder(&userResults, parentQuery)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to get users for reporting")
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user