diff options
-rw-r--r-- | api/emoji.go | 2 | ||||
-rw-r--r-- | api4/emoji.go | 8 | ||||
-rw-r--r-- | api4/emoji_test.go | 7 | ||||
-rw-r--r-- | app/emoji.go | 4 | ||||
-rw-r--r-- | model/client4.go | 12 | ||||
-rw-r--r-- | model/emoji.go | 1 | ||||
-rw-r--r-- | store/sqlstore/emoji_store.go | 19 | ||||
-rw-r--r-- | store/store.go | 2 | ||||
-rw-r--r-- | store/storetest/emoji_store.go | 26 | ||||
-rw-r--r-- | store/storetest/mocks/EmojiStore.go | 10 |
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) |