From 4f4a765e7d0bbfdfecc0c52ae4be35f8d3b737ca Mon Sep 17 00:00:00 2001 From: Joram Wilander Date: Tue, 23 Jan 2018 11:04:44 -0500 Subject: ABC-90 Add POST /emoji/search and GET /emoji/autocomplete API endpoints (#8125) * Add POST /emoji/search and GET /emoji/autocomplete API endpoints * Add constant to be clearer --- api4/api.go | 2 +- api4/emoji.go | 44 ++++++++++++++++++ api4/emoji_test.go | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 179 insertions(+), 1 deletion(-) (limited to 'api4') diff --git a/api4/api.go b/api4/api.go index dd5e56d35..90c9d0df7 100644 --- a/api4/api.go +++ b/api4/api.go @@ -184,7 +184,7 @@ func Init(a *app.App, root *mux.Router, full bool) *API { api.BaseRoutes.DataRetention = api.BaseRoutes.ApiRoot.PathPrefix("/data_retention").Subrouter() api.BaseRoutes.Emojis = api.BaseRoutes.ApiRoot.PathPrefix("/emoji").Subrouter() - api.BaseRoutes.Emoji = api.BaseRoutes.Emojis.PathPrefix("/{emoji_id:[A-Za-z0-9]+}").Subrouter() + api.BaseRoutes.Emoji = api.BaseRoutes.ApiRoot.PathPrefix("/emoji/{emoji_id:[A-Za-z0-9]+}").Subrouter() api.BaseRoutes.ReactionByNameForPostForUser = api.BaseRoutes.PostForUser.PathPrefix("/reactions/{emoji_name:[A-Za-z0-9\\_\\-\\+]+}").Subrouter() diff --git a/api4/emoji.go b/api4/emoji.go index 049e77d3c..30d59125b 100644 --- a/api4/emoji.go +++ b/api4/emoji.go @@ -11,9 +11,15 @@ import ( "github.com/mattermost/mattermost-server/model" ) +const ( + EMOJI_MAX_AUTOCOMPLETE_ITEMS = 100 +) + func (api *API) InitEmoji() { api.BaseRoutes.Emojis.Handle("", api.ApiSessionRequired(createEmoji)).Methods("POST") api.BaseRoutes.Emojis.Handle("", api.ApiSessionRequired(getEmojiList)).Methods("GET") + api.BaseRoutes.Emojis.Handle("/search", api.ApiSessionRequired(searchEmojis)).Methods("POST") + api.BaseRoutes.Emojis.Handle("/autocomplete", api.ApiSessionRequired(autocompleteEmojis)).Methods("GET") api.BaseRoutes.Emoji.Handle("", api.ApiSessionRequired(deleteEmoji)).Methods("DELETE") api.BaseRoutes.Emoji.Handle("", api.ApiSessionRequired(getEmoji)).Methods("GET") api.BaseRoutes.Emoji.Handle("/image", api.ApiSessionRequiredTrustRequester(getEmojiImage)).Methods("GET") @@ -162,3 +168,41 @@ func getEmojiImage(c *Context, w http.ResponseWriter, r *http.Request) { w.Header().Set("Cache-Control", "max-age=2592000, public") w.Write(image) } + +func searchEmojis(c *Context, w http.ResponseWriter, r *http.Request) { + emojiSearch := model.EmojiSearchFromJson(r.Body) + if emojiSearch == nil { + c.SetInvalidParam("term") + return + } + + if emojiSearch.Term == "" { + c.SetInvalidParam("term") + return + } + + emojis, err := c.App.SearchEmoji(emojiSearch.Term, emojiSearch.PrefixOnly, PER_PAGE_MAXIMUM) + if err != nil { + c.Err = err + return + } else { + w.Write([]byte(model.EmojiListToJson(emojis))) + } +} + +func autocompleteEmojis(c *Context, w http.ResponseWriter, r *http.Request) { + name := r.URL.Query().Get("name") + + if name == "" { + c.SetInvalidUrlParam("name") + return + } + + emojis, err := c.App.SearchEmoji(name, true, EMOJI_MAX_AUTOCOMPLETE_ITEMS) + if err != nil { + c.Err = err + return + } else { + w.Write([]byte(model.EmojiListToJson(emojis))) + } +} diff --git a/api4/emoji_test.go b/api4/emoji_test.go index 3b0fecb2b..b8b093656 100644 --- a/api4/emoji_test.go +++ b/api4/emoji_test.go @@ -11,6 +11,8 @@ import ( "github.com/mattermost/mattermost-server/model" "github.com/mattermost/mattermost-server/utils" + + "github.com/stretchr/testify/assert" ) func TestCreateEmoji(t *testing.T) { @@ -432,3 +434,135 @@ func TestGetEmojiImage(t *testing.T) { _, resp = Client.GetEmojiImage("") CheckBadRequestStatus(t, resp) } + +func TestSearchEmoji(t *testing.T) { + th := Setup().InitBasic() + defer th.TearDown() + Client := th.Client + + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) + + searchTerm1 := model.NewId() + searchTerm2 := model.NewId() + + emojis := []*model.Emoji{ + { + CreatorId: th.BasicUser.Id, + Name: searchTerm1, + }, + { + CreatorId: th.BasicUser.Id, + Name: "blargh_" + searchTerm2, + }, + } + + for idx, emoji := range emojis { + emoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + CheckNoError(t, resp) + emojis[idx] = emoji + } + + search := &model.EmojiSearch{Term: searchTerm1} + remojis, resp := Client.SearchEmoji(search) + CheckNoError(t, resp) + CheckOKStatus(t, resp) + + found := false + for _, e := range remojis { + if e.Name == emojis[0].Name { + found = true + } + } + + assert.True(t, found) + + search.Term = searchTerm2 + search.PrefixOnly = true + remojis, resp = Client.SearchEmoji(search) + CheckNoError(t, resp) + CheckOKStatus(t, resp) + + found = false + for _, e := range remojis { + if e.Name == emojis[1].Name { + found = true + } + } + + assert.False(t, found) + + search.PrefixOnly = false + remojis, resp = Client.SearchEmoji(search) + CheckNoError(t, resp) + CheckOKStatus(t, resp) + + found = false + for _, e := range remojis { + if e.Name == emojis[1].Name { + found = true + } + } + + assert.True(t, found) + + search.Term = "" + _, resp = Client.SearchEmoji(search) + CheckBadRequestStatus(t, resp) + + Client.Logout() + _, resp = Client.SearchEmoji(search) + CheckUnauthorizedStatus(t, resp) +} + +func TestAutocompleteEmoji(t *testing.T) { + th := Setup().InitBasic() + defer th.TearDown() + Client := th.Client + + th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableCustomEmoji = true }) + + searchTerm1 := model.NewId() + + emojis := []*model.Emoji{ + { + CreatorId: th.BasicUser.Id, + Name: searchTerm1, + }, + { + CreatorId: th.BasicUser.Id, + Name: "blargh_" + searchTerm1, + }, + } + + for idx, emoji := range emojis { + emoji, resp := Client.CreateEmoji(emoji, utils.CreateTestGif(t, 10, 10), "image.gif") + CheckNoError(t, resp) + emojis[idx] = emoji + } + + remojis, resp := Client.AutocompleteEmoji(searchTerm1, "") + CheckNoError(t, resp) + CheckOKStatus(t, resp) + + found1 := false + found2 := false + for _, e := range remojis { + if e.Name == emojis[0].Name { + found1 = true + } + + if e.Name == emojis[1].Name { + found2 = true + } + } + + assert.True(t, found1) + assert.False(t, found2) + + _, resp = Client.AutocompleteEmoji("", "") + CheckBadRequestStatus(t, resp) + + Client.Logout() + _, resp = Client.AutocompleteEmoji(searchTerm1, "") + CheckUnauthorizedStatus(t, resp) +} -- cgit v1.2.3-1-g7c22