summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoram Wilander <jwawilander@gmail.com>2018-01-19 09:37:59 -0500
committerHarrison Healey <harrisonmhealey@gmail.com>2018-01-19 09:37:59 -0500
commita8445775351c32f8a12081f60bda2099571b2758 (patch)
treebf5a6aace4bb5f4356d9103fbe1d68468e88ea22
parent9d6a9ff4be15f673e8364a984ccc2b2c3a465b73 (diff)
downloadchat-a8445775351c32f8a12081f60bda2099571b2758.tar.gz
chat-a8445775351c32f8a12081f60bda2099571b2758.tar.bz2
chat-a8445775351c32f8a12081f60bda2099571b2758.zip
Add sort query parameter to GET /emojis (#8121)
-rw-r--r--api/emoji.go2
-rw-r--r--api4/emoji.go8
-rw-r--r--api4/emoji_test.go7
-rw-r--r--app/emoji.go4
-rw-r--r--model/client4.go12
-rw-r--r--model/emoji.go1
-rw-r--r--store/sqlstore/emoji_store.go19
-rw-r--r--store/store.go2
-rw-r--r--store/storetest/emoji_store.go26
-rw-r--r--store/storetest/mocks/EmojiStore.go10
10 files changed, 68 insertions, 23 deletions
diff --git a/api/emoji.go b/api/emoji.go
index ed21e2192..b366530ba 100644
--- a/api/emoji.go
+++ b/api/emoji.go
@@ -31,7 +31,7 @@ func getEmoji(c *Context, w http.ResponseWriter, r *http.Request) {
return
}
- listEmoji, err := c.App.GetEmojiList(0, 100000)
+ listEmoji, err := c.App.GetEmojiList(0, 100000, "")
if err != nil {
c.Err = err
return
diff --git a/api4/emoji.go b/api4/emoji.go
index 341c565d8..049e77d3c 100644
--- a/api4/emoji.go
+++ b/api4/emoji.go
@@ -75,7 +75,13 @@ func getEmojiList(c *Context, w http.ResponseWriter, r *http.Request) {
return
}
- listEmoji, err := c.App.GetEmojiList(c.Params.Page, c.Params.PerPage)
+ sort := r.URL.Query().Get("sort")
+ if sort != "" && sort != model.EMOJI_SORT_BY_NAME {
+ c.SetInvalidUrlParam("sort")
+ return
+ }
+
+ listEmoji, err := c.App.GetEmojiList(c.Params.Page, c.Params.PerPage, sort)
if err != nil {
c.Err = err
return
diff --git a/api4/emoji_test.go b/api4/emoji_test.go
index 32492b704..3b0fecb2b 100644
--- a/api4/emoji_test.go
+++ b/api4/emoji_test.go
@@ -209,6 +209,13 @@ func TestGetEmojiList(t *testing.T) {
if len(listEmoji) != 1 {
t.Fatal("should only return 1")
}
+
+ listEmoji, resp = Client.GetSortedEmojiList(0, 100, model.EMOJI_SORT_BY_NAME)
+ CheckNoError(t, resp)
+
+ if len(listEmoji) == 0 {
+ t.Fatal("should return more than 0")
+ }
}
func TestDeleteEmoji(t *testing.T) {
diff --git a/app/emoji.go b/app/emoji.go
index f62a8686b..2786af9c9 100644
--- a/app/emoji.go
+++ b/app/emoji.go
@@ -66,8 +66,8 @@ func (a *App) CreateEmoji(sessionUserId string, emoji *model.Emoji, multiPartIma
}
}
-func (a *App) GetEmojiList(page, perPage int) ([]*model.Emoji, *model.AppError) {
- if result := <-a.Srv.Store.Emoji().GetList(page*perPage, perPage); result.Err != nil {
+func (a *App) GetEmojiList(page, perPage int, sort string) ([]*model.Emoji, *model.AppError) {
+ if result := <-a.Srv.Store.Emoji().GetList(page*perPage, perPage, sort); result.Err != nil {
return nil, result.Err
} else {
return result.Data.([]*model.Emoji), nil
diff --git a/model/client4.go b/model/client4.go
index 88645ec74..c44855993 100644
--- a/model/client4.go
+++ b/model/client4.go
@@ -3023,6 +3023,18 @@ func (c *Client4) GetEmojiList(page, perPage int) ([]*Emoji, *Response) {
}
}
+// GetSortedEmojiList returns a page of custom emoji on the system sorted based on the sort
+// parameter, blank for no sorting and "name" to sort by emoji names.
+func (c *Client4) GetSortedEmojiList(page, perPage int, sort string) ([]*Emoji, *Response) {
+ query := fmt.Sprintf("?page=%v&per_page=%v&sort=%v", page, perPage, sort)
+ if r, err := c.DoApiGet(c.GetEmojisRoute()+query, ""); err != nil {
+ return nil, BuildErrorResponse(r, err)
+ } else {
+ defer closeBody(r)
+ return EmojiListFromJson(r.Body), BuildResponse(r)
+ }
+}
+
// DeleteEmoji delete an custom emoji on the provided emoji id string.
func (c *Client4) DeleteEmoji(emojiId string) (bool, *Response) {
if r, err := c.DoApiDelete(c.GetEmojiRoute(emojiId)); err != nil {
diff --git a/model/emoji.go b/model/emoji.go
index 784fe832b..3deff4c5f 100644
--- a/model/emoji.go
+++ b/model/emoji.go
@@ -11,6 +11,7 @@ import (
const (
EMOJI_NAME_MAX_LENGTH = 64
+ EMOJI_SORT_BY_NAME = "name"
)
type Emoji struct {
diff --git a/store/sqlstore/emoji_store.go b/store/sqlstore/emoji_store.go
index 9ef071f02..734190dbb 100644
--- a/store/sqlstore/emoji_store.go
+++ b/store/sqlstore/emoji_store.go
@@ -123,18 +123,19 @@ func (es SqlEmojiStore) GetByName(name string) store.StoreChannel {
})
}
-func (es SqlEmojiStore) GetList(offset, limit int) store.StoreChannel {
+func (es SqlEmojiStore) GetList(offset, limit int, sort string) store.StoreChannel {
return store.Do(func(result *store.StoreResult) {
var emoji []*model.Emoji
- if _, err := es.GetReplica().Select(&emoji,
- `SELECT
- *
- FROM
- Emoji
- WHERE
- DeleteAt = 0
- LIMIT :Limit OFFSET :Offset`, map[string]interface{}{"Offset": offset, "Limit": limit}); err != nil {
+ query := "SELECT * FROM Emoji WHERE DeleteAt = 0"
+
+ if sort == model.EMOJI_SORT_BY_NAME {
+ query += " ORDER BY Name"
+ }
+
+ query += " LIMIT :Limit OFFSET :Offset"
+
+ if _, err := es.GetReplica().Select(&emoji, query, map[string]interface{}{"Offset": offset, "Limit": limit}); err != nil {
result.Err = model.NewAppError("SqlEmojiStore.GetList", "store.sql_emoji.get_all.app_error", nil, err.Error(), http.StatusInternalServerError)
} else {
result.Data = emoji
diff --git a/store/store.go b/store/store.go
index c66daec7f..8cb5093ea 100644
--- a/store/store.go
+++ b/store/store.go
@@ -391,7 +391,7 @@ type EmojiStore interface {
Save(emoji *model.Emoji) StoreChannel
Get(id string, allowFromCache bool) StoreChannel
GetByName(name string) StoreChannel
- GetList(offset, limit int) StoreChannel
+ GetList(offset, limit int, sort string) StoreChannel
Delete(id string, time int64) StoreChannel
}
diff --git a/store/storetest/emoji_store.go b/store/storetest/emoji_store.go
index fc5a31a43..a862440e5 100644
--- a/store/storetest/emoji_store.go
+++ b/store/storetest/emoji_store.go
@@ -9,6 +9,8 @@ import (
"github.com/mattermost/mattermost-server/model"
"github.com/mattermost/mattermost-server/store"
+
+ "github.com/stretchr/testify/assert"
)
func TestEmojiStore(t *testing.T, ss store.Store) {
@@ -133,15 +135,15 @@ func testEmojiGetList(t *testing.T, ss store.Store) {
emojis := []model.Emoji{
{
CreatorId: model.NewId(),
- Name: model.NewId(),
+ Name: "00000000000000000000000000a" + model.NewId(),
},
{
CreatorId: model.NewId(),
- Name: model.NewId(),
+ Name: "00000000000000000000000000b" + model.NewId(),
},
{
CreatorId: model.NewId(),
- Name: model.NewId(),
+ Name: "00000000000000000000000000c" + model.NewId(),
},
}
@@ -154,7 +156,7 @@ func testEmojiGetList(t *testing.T, ss store.Store) {
}
}()
- if result := <-ss.Emoji().GetList(0, 100); result.Err != nil {
+ if result := <-ss.Emoji().GetList(0, 100, ""); result.Err != nil {
t.Fatal(result.Err)
} else {
for _, emoji := range emojis {
@@ -172,4 +174,20 @@ func testEmojiGetList(t *testing.T, ss store.Store) {
}
}
}
+
+ result := <-ss.Emoji().GetList(0, 3, model.EMOJI_SORT_BY_NAME)
+ assert.Nil(t, result.Err)
+ remojis := result.Data.([]*model.Emoji)
+ assert.Equal(t, 3, len(remojis))
+ assert.Equal(t, emojis[0].Name, remojis[0].Name)
+ assert.Equal(t, emojis[1].Name, remojis[1].Name)
+ assert.Equal(t, emojis[2].Name, remojis[2].Name)
+
+ result = <-ss.Emoji().GetList(1, 2, model.EMOJI_SORT_BY_NAME)
+ assert.Nil(t, result.Err)
+ remojis = result.Data.([]*model.Emoji)
+ assert.Equal(t, 2, len(remojis))
+ assert.Equal(t, emojis[1].Name, remojis[0].Name)
+ assert.Equal(t, emojis[2].Name, remojis[1].Name)
+
}
diff --git a/store/storetest/mocks/EmojiStore.go b/store/storetest/mocks/EmojiStore.go
index c01e64578..d1bfe7f00 100644
--- a/store/storetest/mocks/EmojiStore.go
+++ b/store/storetest/mocks/EmojiStore.go
@@ -61,13 +61,13 @@ func (_m *EmojiStore) GetByName(name string) store.StoreChannel {
return r0
}
-// GetList provides a mock function with given fields: offset, limit
-func (_m *EmojiStore) GetList(offset int, limit int) store.StoreChannel {
- ret := _m.Called(offset, limit)
+// GetList provides a mock function with given fields: offset, limit, sort
+func (_m *EmojiStore) GetList(offset int, limit int, sort string) store.StoreChannel {
+ ret := _m.Called(offset, limit, sort)
var r0 store.StoreChannel
- if rf, ok := ret.Get(0).(func(int, int) store.StoreChannel); ok {
- r0 = rf(offset, limit)
+ if rf, ok := ret.Get(0).(func(int, int, string) store.StoreChannel); ok {
+ r0 = rf(offset, limit, sort)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(store.StoreChannel)