[MM-56206] Allow for proper paging and sorting (#25726)

Co-authored-by: Mattermost Build <build@mattermost.com>
Этот коммит содержится в:
Devin Binnie
2023-12-17 19:26:06 -05:00
коммит произвёл GitHub
родитель 485ae6ae4e
Коммит 5c061a6f75
7 изменённых файлов: 114 добавлений и 35 удалений

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

@@ -28,6 +28,11 @@ func getUsersForReporting(c *Context, w http.ResponseWriter, r *http.Request) {
sortColumn = r.URL.Query().Get("sort_column")
}
direction := "down"
if r.URL.Query().Get("direction") == "up" {
direction = "up"
}
pageSize := 50
if pageSizeStr, err := strconv.ParseInt(r.URL.Query().Get("page_size"), 10, 64); err == nil {
pageSize = int(pageSizeStr)
@@ -48,14 +53,15 @@ func getUsersForReporting(c *Context, w http.ResponseWriter, r *http.Request) {
options := &model.UserReportOptions{
ReportingBaseOptions: model.ReportingBaseOptions{
SortColumn: sortColumn,
SortDesc: r.URL.Query().Get("sort_direction") == "desc",
PageSize: pageSize,
LastSortColumnValue: r.URL.Query().Get("last_column_value"),
DateRange: r.URL.Query().Get("date_range"),
Direction: direction,
SortColumn: sortColumn,
SortDesc: r.URL.Query().Get("sort_direction") == "desc",
PageSize: pageSize,
FromColumnValue: r.URL.Query().Get("from_column_value"),
FromId: r.URL.Query().Get("from_id"),
DateRange: r.URL.Query().Get("date_range"),
},
Team: teamFilter,
LastUserId: r.URL.Query().Get("last_id"),
Role: r.URL.Query().Get("role_filter"),
HasNoTeam: r.URL.Query().Get("has_no_team") == "true",
HideActive: hideActive,

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

@@ -2297,17 +2297,28 @@ func (us SqlUserStore) GetUserReport(filter *model.UserReportOptions) ([]*model.
Select(selectColumns...).
From("Users u").
LeftJoin("Status s ON s.UserId = u.Id").
Where(sq.Or{
sq.Gt{filter.SortColumn: filter.LastSortColumnValue},
sq.And{
sq.Eq{filter.SortColumn: filter.LastSortColumnValue},
sq.Gt{"u.Id": filter.LastUserId},
},
}).
Where(sq.Expr("u.Id NOT IN (SELECT UserId FROM Bots)")).
GroupBy("u.Id").
OrderBy(sortColumnValue, "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},
},
})
}
if filter.PageSize > 0 {
query = query.Limit(uint64(filter.PageSize))
}

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

@@ -6321,11 +6321,62 @@ func testGetUserReport(t *testing.T, rctx request.CTX, ss store.Store) {
t.Run("should return correct paging", func(t *testing.T) {
userReport, err := ss.User().GetUserReport(&model.UserReportOptions{
ReportingBaseOptions: model.ReportingBaseOptions{
SortColumn: "Username",
PageSize: 50,
LastSortColumnValue: u2.Username,
SortColumn: "Username",
Direction: "down",
PageSize: 50,
FromColumnValue: u2.Username,
FromId: u2.Id,
},
})
require.NoError(t, err)
require.NotNil(t, userReport)
require.Equal(t, 1, len(userReport))
require.NotNil(t, userReport[0])
require.Equal(t, u3.Username, userReport[0].Username)
userReport, err = ss.User().GetUserReport(&model.UserReportOptions{
ReportingBaseOptions: model.ReportingBaseOptions{
SortColumn: "Username",
SortDesc: true,
Direction: "down",
PageSize: 50,
FromColumnValue: u2.Username,
FromId: u2.Id,
},
})
require.NoError(t, err)
require.NotNil(t, userReport)
require.Equal(t, 1, len(userReport))
require.NotNil(t, userReport[0])
require.Equal(t, u1.Username, userReport[0].Username)
userReport, err = ss.User().GetUserReport(&model.UserReportOptions{
ReportingBaseOptions: model.ReportingBaseOptions{
SortColumn: "Username",
Direction: "up",
PageSize: 50,
FromColumnValue: u2.Username,
FromId: u2.Id,
},
})
require.NoError(t, err)
require.NotNil(t, userReport)
require.Equal(t, 1, len(userReport))
require.NotNil(t, userReport[0])
require.Equal(t, u1.Username, userReport[0].Username)
userReport, err = ss.User().GetUserReport(&model.UserReportOptions{
ReportingBaseOptions: model.ReportingBaseOptions{
SortColumn: "Username",
SortDesc: true,
Direction: "up",
PageSize: 50,
FromColumnValue: u2.Username,
FromId: u2.Id,
},
LastUserId: u2.Id,
})
require.NoError(t, err)
require.NotNil(t, userReport)

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

@@ -1924,6 +1924,9 @@ func (c *Client4) EnableUserAccessToken(ctx context.Context, tokenId string) (*R
func (c *Client4) GetUsersForReporting(ctx context.Context, options *UserReportOptions) ([]*UserReport, *Response, error) {
values := url.Values{}
if options.Direction != "" {
values.Set("direction", options.Direction)
}
if options.SortColumn != "" {
values.Set("sort_column", options.SortColumn)
}
@@ -1942,11 +1945,11 @@ func (c *Client4) GetUsersForReporting(ctx context.Context, options *UserReportO
if options.SortDesc {
values.Set("sort_direction", "desc")
}
if options.LastSortColumnValue != "" {
values.Set("last_column_value", options.LastSortColumnValue)
if options.FromColumnValue != "" {
values.Set("from_column_value", options.FromColumnValue)
}
if options.LastUserId != "" {
values.Set("last_id", options.LastUserId)
if options.FromId != "" {
values.Set("from_id", options.FromId)
}
if options.Role != "" {
values.Set("role_filter", options.Role)

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

@@ -23,13 +23,15 @@ var (
)
type ReportingBaseOptions struct {
SortDesc bool
PageSize int
SortColumn string
LastSortColumnValue string
DateRange string
StartAt int64
EndAt int64
SortDesc bool
Direction string // Accepts only "up" or "down"
PageSize int
SortColumn string
FromColumnValue string
FromId string
DateRange string
StartAt int64
EndAt int64
}
func (options *ReportingBaseOptions) PopulateDateRange(now time.Time) {
@@ -75,7 +77,6 @@ type UserReport struct {
type UserReportOptions struct {
ReportingBaseOptions
LastUserId string
Role string
Team string
HasNoTeam bool