From 37e00ef916af9a5aeae760a01fa0a0cf8ca93637 Mon Sep 17 00:00:00 2001 From: Christopher Speller Date: Wed, 26 Sep 2018 07:27:04 -0700 Subject: Adding paging to elasticsearch API. (#9425) --- api4/post.go | 36 ++++++++++++++++++++++++++---------- api4/post_test.go | 38 +++++++++++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 15 deletions(-) (limited to 'api4') diff --git a/api4/post.go b/api4/post.go index 46c688014..6500cba32 100644 --- a/api4/post.go +++ b/api4/post.go @@ -330,26 +330,42 @@ func searchPosts(c *Context, w http.ResponseWriter, r *http.Request) { return } - includeDeletedChannels := r.URL.Query().Get("include_deleted_channels") == "true" + params := model.SearchParameterFromJson(r.Body) - props := model.StringInterfaceFromJson(r.Body) - - terms, ok := props["terms"].(string) - if !ok || len(terms) == 0 { + if params.Terms == nil || len(*params.Terms) == 0 { c.SetInvalidParam("terms") return } + terms := *params.Terms + + timeZoneOffset := 0 + if params.TimeZoneOffset != nil { + timeZoneOffset = *params.TimeZoneOffset + } + + isOrSearch := false + if params.IsOrSearch != nil { + isOrSearch = *params.IsOrSearch + } + + page := 0 + if params.Page != nil { + page = *params.Page + } - timeZoneOffset, ok := props["time_zone_offset"].(float64) - if !ok { - timeZoneOffset = 0 + perPage := 60 + if params.PerPage != nil { + perPage = *params.PerPage } - isOrSearch, _ := props["is_or_search"].(bool) + includeDeletedChannels := false + if params.IncludeDeletedChannels != nil { + includeDeletedChannels = *params.IncludeDeletedChannels + } startTime := time.Now() - results, err := c.App.SearchPostsInTeam(terms, c.Session.UserId, c.Params.TeamId, isOrSearch, includeDeletedChannels, int(timeZoneOffset)) + results, err := c.App.SearchPostsInTeam(terms, c.Session.UserId, c.Params.TeamId, isOrSearch, includeDeletedChannels, int(timeZoneOffset), page, perPage) elapsedTime := float64(time.Since(startTime)) / float64(time.Second) metrics := c.App.Metrics diff --git a/api4/post_test.go b/api4/post_test.go index 3c9875975..70404fdb5 100644 --- a/api4/post_test.go +++ b/api4/post_test.go @@ -15,6 +15,8 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" + "github.com/mattermost/mattermost-server/app" "github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/utils" @@ -1323,6 +1325,24 @@ func TestSearchPosts(t *testing.T) { t.Fatal("wrong search") } + terms = "search" + page := 0 + perPage := 2 + searchParams = model.SearchParameter{ + Terms: &terms, + IsOrSearch: &isOrSearch, + TimeZoneOffset: &timezoneOffset, + Page: &page, + PerPage: &perPage, + } + posts2, resp := Client.SearchPostsWithParams(th.BasicTeam.Id, &searchParams) + CheckNoError(t, resp) + if len(posts2.Order) != 3 { // We don't support paging for DB search yet, modify this when we do. + t.Fatal("Wrong number of posts", len(posts2.Order)) + } + assert.Equal(t, posts.Order[0], posts2.Order[0]) + assert.Equal(t, posts.Order[1], posts2.Order[1]) + posts, resp = Client.SearchPosts(th.BasicTeam.Id, "search", false) CheckNoError(t, resp) if len(posts.Order) != 3 { @@ -1341,7 +1361,15 @@ func TestSearchPosts(t *testing.T) { t.Fatal("wrong search") } - posts, resp = Client.SearchPostsIncludeDeletedChannels(th.BasicTeam.Id, "#hashtag", false) + terms = "#hashtag" + includeDeletedChannels := true + searchParams = model.SearchParameter{ + Terms: &terms, + IsOrSearch: &isOrSearch, + TimeZoneOffset: &timezoneOffset, + IncludeDeletedChannels: &includeDeletedChannels, + } + posts, resp = Client.SearchPostsWithParams(th.BasicTeam.Id, &searchParams) CheckNoError(t, resp) if len(posts.Order) != 2 { t.Fatal("wrong search") @@ -1351,7 +1379,7 @@ func TestSearchPosts(t *testing.T) { *cfg.TeamSettings.ExperimentalViewArchivedChannels = false }) - posts, resp = Client.SearchPostsIncludeDeletedChannels(th.BasicTeam.Id, "#hashtag", false) + posts, resp = Client.SearchPostsWithParams(th.BasicTeam.Id, &searchParams) CheckNoError(t, resp) if len(posts.Order) != 1 { t.Fatal("wrong search") @@ -1389,13 +1417,13 @@ func TestSearchHashtagPosts(t *testing.T) { Client := th.Client message := "#sgtitlereview with space" - _ = th.CreateMessagePost(message) + assert.NotNil(t, th.CreateMessagePost(message)) message = "#sgtitlereview\n with return" - _ = th.CreateMessagePost(message) + assert.NotNil(t, th.CreateMessagePost(message)) message = "no hashtag" - _ = th.CreateMessagePost(message) + assert.NotNil(t, th.CreateMessagePost(message)) posts, resp := Client.SearchPosts(th.BasicTeam.Id, "#sgtitlereview", false) CheckNoError(t, resp) -- cgit v1.2.3-1-g7c22