MM-43780: Adjust getPostThread API for easier pagination (#20172)
Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
b10ff1b1f7
Коммит
2315fcf05b
@@ -529,11 +529,9 @@ func getPostThread(c *Context, w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fromPost := r.URL.Query().Get("fromPost")
|
fromPost := r.URL.Query().Get("fromPost")
|
||||||
// Either both have to be set, or none have to be set.
|
// Either only fromCreateAt must be set, or both fromPost and fromCreateAt must be set
|
||||||
// Setting one and not setting the other is an error.
|
if fromPost != "" && fromCreateAt == 0 {
|
||||||
if (fromPost == "" && fromCreateAt != 0) || (fromPost != "" && fromCreateAt == 0) {
|
c.SetInvalidParam("if fromPost is set, then fromCreatAt must also be set")
|
||||||
c.SetInvalidParam("fromPost/fromCreateAt")
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
direction := ""
|
direction := ""
|
||||||
|
|||||||
@@ -604,23 +604,34 @@ func (s *SqlPostStore) getPostWithCollapsedThreads(id, userID string, opts model
|
|||||||
query = query.OrderBy("CreateAt " + sort + ", Id " + sort)
|
query = query.OrderBy("CreateAt " + sort + ", Id " + sort)
|
||||||
}
|
}
|
||||||
|
|
||||||
if opts.FromPost != "" && opts.FromCreateAt != 0 {
|
if opts.FromCreateAt != 0 {
|
||||||
if opts.Direction == "down" {
|
if opts.Direction == "down" {
|
||||||
|
direction := sq.Gt{"Posts.CreateAt": opts.FromCreateAt}
|
||||||
|
if opts.FromPost != "" {
|
||||||
query = query.Where(sq.Or{
|
query = query.Where(sq.Or{
|
||||||
sq.Gt{"Posts.CreateAt": opts.FromCreateAt},
|
direction,
|
||||||
sq.And{
|
sq.And{
|
||||||
sq.Eq{"Posts.CreateAt": opts.FromCreateAt},
|
sq.Eq{"Posts.CreateAt": opts.FromCreateAt},
|
||||||
sq.Gt{"Posts.Id": opts.FromPost},
|
sq.Gt{"Posts.Id": opts.FromPost},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
query = query.Where(direction)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
direction := sq.Lt{"Posts.CreateAt": opts.FromCreateAt}
|
||||||
|
if opts.FromPost != "" {
|
||||||
query = query.Where(sq.Or{
|
query = query.Where(sq.Or{
|
||||||
sq.Lt{"Posts.CreateAt": opts.FromCreateAt},
|
direction,
|
||||||
sq.And{
|
sq.And{
|
||||||
sq.Eq{"Posts.CreateAt": opts.FromCreateAt},
|
sq.Eq{"Posts.CreateAt": opts.FromCreateAt},
|
||||||
sq.Lt{"Posts.Id": opts.FromPost},
|
sq.Lt{"Posts.Id": opts.FromPost},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
} else {
|
||||||
|
query = query.Where(direction)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -715,23 +726,34 @@ func (s *SqlPostStore) Get(ctx context.Context, id string, opts model.GetPostsOp
|
|||||||
query = query.OrderBy("CreateAt " + sort + ", Id " + sort)
|
query = query.OrderBy("CreateAt " + sort + ", Id " + sort)
|
||||||
}
|
}
|
||||||
|
|
||||||
if opts.FromPost != "" && opts.FromCreateAt != 0 {
|
if opts.FromCreateAt != 0 {
|
||||||
if opts.Direction == "down" {
|
if opts.Direction == "down" {
|
||||||
|
direction := sq.Gt{"p.CreateAt": opts.FromCreateAt}
|
||||||
|
if opts.FromPost != "" {
|
||||||
query = query.Where(sq.Or{
|
query = query.Where(sq.Or{
|
||||||
sq.Gt{"p.CreateAt": opts.FromCreateAt},
|
direction,
|
||||||
sq.And{
|
sq.And{
|
||||||
sq.Eq{"p.CreateAt": opts.FromCreateAt},
|
sq.Eq{"p.CreateAt": opts.FromCreateAt},
|
||||||
sq.Gt{"p.Id": opts.FromPost},
|
sq.Gt{"p.Id": opts.FromPost},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
query = query.Where(direction)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
direction := sq.Lt{"p.CreateAt": opts.FromCreateAt}
|
||||||
|
if opts.FromPost != "" {
|
||||||
query = query.Where(sq.Or{
|
query = query.Where(sq.Or{
|
||||||
sq.Lt{"p.CreateAt": opts.FromCreateAt},
|
direction,
|
||||||
sq.And{
|
sq.And{
|
||||||
sq.Eq{"p.CreateAt": opts.FromCreateAt},
|
sq.Eq{"p.CreateAt": opts.FromCreateAt},
|
||||||
sq.Lt{"p.Id": opts.FromPost},
|
sq.Lt{"p.Id": opts.FromPost},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
} else {
|
||||||
|
query = query.Where(direction)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -567,7 +567,7 @@ func testPostStoreGetForThread(t *testing.T, ss store.Store) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
_, err = ss.Post().Save(&model.Post{ChannelId: o1.ChannelId, UserId: model.NewId(), Message: NewTestId(), RootId: o1.Id})
|
_, err = ss.Post().Save(&model.Post{ChannelId: o1.ChannelId, UserId: model.NewId(), Message: NewTestId(), RootId: o1.Id})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
_, err = ss.Post().Save(&model.Post{ChannelId: o1.ChannelId, UserId: model.NewId(), Message: NewTestId(), RootId: o1.Id})
|
m1, err := ss.Post().Save(&model.Post{ChannelId: o1.ChannelId, UserId: model.NewId(), Message: NewTestId(), RootId: o1.Id})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
_, err = ss.Post().Save(&model.Post{ChannelId: o1.ChannelId, UserId: model.NewId(), Message: NewTestId(), RootId: o1.Id})
|
_, err = ss.Post().Save(&model.Post{ChannelId: o1.ChannelId, UserId: model.NewId(), Message: NewTestId(), RootId: o1.Id})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -615,6 +615,20 @@ func testPostStoreGetForThread(t *testing.T, ss store.Store) {
|
|||||||
assert.LessOrEqual(t, r1.Posts[r1.Order[1]].CreateAt, firstPostCreateAt)
|
assert.LessOrEqual(t, r1.Posts[r1.Order[1]].CreateAt, firstPostCreateAt)
|
||||||
assert.False(t, r1.HasNext)
|
assert.False(t, r1.HasNext)
|
||||||
|
|
||||||
|
// Only with CreateAt
|
||||||
|
opts = model.GetPostsOptions{
|
||||||
|
CollapsedThreads: false,
|
||||||
|
PerPage: 1,
|
||||||
|
Direction: "up",
|
||||||
|
FromCreateAt: m1.CreateAt,
|
||||||
|
SkipFetchThreads: false,
|
||||||
|
}
|
||||||
|
r1, err = ss.Post().Get(context.Background(), o1.Id, opts, o1.UserId)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Len(t, r1.Order, 2) // including the root post
|
||||||
|
assert.LessOrEqual(t, r1.Posts[r1.Order[1]].CreateAt, m1.CreateAt)
|
||||||
|
assert.True(t, r1.HasNext)
|
||||||
|
|
||||||
// Non-CRT mode
|
// Non-CRT mode
|
||||||
opts = model.GetPostsOptions{
|
opts = model.GetPostsOptions{
|
||||||
CollapsedThreads: false,
|
CollapsedThreads: false,
|
||||||
@@ -659,6 +673,20 @@ func testPostStoreGetForThread(t *testing.T, ss store.Store) {
|
|||||||
assert.Len(t, r1.Order, 3) // including the root post
|
assert.Len(t, r1.Order, 3) // including the root post
|
||||||
assert.LessOrEqual(t, r1.Posts[r1.Order[1]].CreateAt, firstPostCreateAt)
|
assert.LessOrEqual(t, r1.Posts[r1.Order[1]].CreateAt, firstPostCreateAt)
|
||||||
assert.False(t, r1.HasNext)
|
assert.False(t, r1.HasNext)
|
||||||
|
|
||||||
|
// Only with CreateAt
|
||||||
|
opts = model.GetPostsOptions{
|
||||||
|
CollapsedThreads: false,
|
||||||
|
PerPage: 1,
|
||||||
|
Direction: "down",
|
||||||
|
FromCreateAt: m1.CreateAt,
|
||||||
|
SkipFetchThreads: false,
|
||||||
|
}
|
||||||
|
r1, err = ss.Post().Get(context.Background(), o1.Id, opts, o1.UserId)
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Len(t, r1.Order, 2) // including the root post
|
||||||
|
assert.GreaterOrEqual(t, r1.Posts[r1.Order[1]].CreateAt, m1.CreateAt)
|
||||||
|
assert.True(t, r1.HasNext)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user