summaryrefslogtreecommitdiffstats
path: root/api4
diff options
context:
space:
mode:
authorJoram Wilander <jwawilander@gmail.com>2018-01-23 11:04:44 -0500
committerChristopher Speller <crspeller@gmail.com>2018-01-23 08:04:44 -0800
commit4f4a765e7d0bbfdfecc0c52ae4be35f8d3b737ca (patch)
tree063aa55db9299f09d4176b201db658f1d7acced5 /api4
parent599991ea731953f772824ce3ed1e591246aa004f (diff)
downloadchat-4f4a765e7d0bbfdfecc0c52ae4be35f8d3b737ca.tar.gz
chat-4f4a765e7d0bbfdfecc0c52ae4be35f8d3b737ca.tar.bz2
chat-4f4a765e7d0bbfdfecc0c52ae4be35f8d3b737ca.zip
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
Diffstat (limited to 'api4')
-rw-r--r--api4/api.go2
-rw-r--r--api4/emoji.go44
-rw-r--r--api4/emoji_test.go134
3 files changed, 179 insertions, 1 deletions
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)
+}