From f54aee1ef5466fdf11803cd75be3b7267e68540f Mon Sep 17 00:00:00 2001 From: Joram Wilander Date: Tue, 4 Jul 2017 02:58:02 -0400 Subject: Add paging to the GET /emojis endpoint (#6802) --- api/emoji.go | 2 +- api4/emoji.go | 2 +- api4/emoji_test.go | 11 +++++++++-- app/emoji.go | 4 ++-- model/client4.go | 7 ++++--- store/sql_emoji_store.go | 7 ++++--- store/sql_emoji_store_test.go | 4 ++-- store/store.go | 2 +- 8 files changed, 24 insertions(+), 15 deletions(-) diff --git a/api/emoji.go b/api/emoji.go index 31620dc1a..337cfe6f5 100644 --- a/api/emoji.go +++ b/api/emoji.go @@ -36,7 +36,7 @@ func getEmoji(c *Context, w http.ResponseWriter, r *http.Request) { return } - listEmoji, err := app.GetEmojiList() + listEmoji, err := app.GetEmojiList(0, 100000) if err != nil { c.Err = err return diff --git a/api4/emoji.go b/api4/emoji.go index 1d9188af0..f29573383 100644 --- a/api4/emoji.go +++ b/api4/emoji.go @@ -81,7 +81,7 @@ func getEmojiList(c *Context, w http.ResponseWriter, r *http.Request) { return } - listEmoji, err := app.GetEmojiList() + listEmoji, err := app.GetEmojiList(c.Params.Page, c.Params.PerPage) if err != nil { c.Err = err return diff --git a/api4/emoji_test.go b/api4/emoji_test.go index dcd6dddb7..2ca18a9cc 100644 --- a/api4/emoji_test.go +++ b/api4/emoji_test.go @@ -173,7 +173,7 @@ func TestGetEmojiList(t *testing.T) { emojis[idx] = emoji } - listEmoji, resp := Client.GetEmojiList() + listEmoji, resp := Client.GetEmojiList(0, 100) CheckNoError(t, resp) for _, emoji := range emojis { found := false @@ -190,7 +190,7 @@ func TestGetEmojiList(t *testing.T) { _, resp = Client.DeleteEmoji(emojis[0].Id) CheckNoError(t, resp) - listEmoji, resp = Client.GetEmojiList() + listEmoji, resp = Client.GetEmojiList(0, 100) CheckNoError(t, resp) found := false for _, savedEmoji := range listEmoji { @@ -202,6 +202,13 @@ func TestGetEmojiList(t *testing.T) { t.Fatalf("should not get a deleted emoji %v", emojis[0].Id) } } + + listEmoji, resp = Client.GetEmojiList(0, 1) + CheckNoError(t, resp) + + if len(listEmoji) != 1 { + t.Fatal("should only return 1") + } } func TestDeleteEmoji(t *testing.T) { diff --git a/app/emoji.go b/app/emoji.go index 9f09617e8..564085d82 100644 --- a/app/emoji.go +++ b/app/emoji.go @@ -66,8 +66,8 @@ func CreateEmoji(sessionUserId string, emoji *model.Emoji, multiPartImageData *m } } -func GetEmojiList() ([]*model.Emoji, *model.AppError) { - if result := <-Srv.Store.Emoji().GetAll(); result.Err != nil { +func GetEmojiList(page, perPage int) ([]*model.Emoji, *model.AppError) { + if result := <-Srv.Store.Emoji().GetList(page*perPage, perPage); 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 8df1f8e32..da3dfacb7 100644 --- a/model/client4.go +++ b/model/client4.go @@ -2699,9 +2699,10 @@ func (c *Client4) CreateEmoji(emoji *Emoji, image []byte, filename string) (*Emo return c.DoEmojiUploadFile(c.GetEmojisRoute(), body.Bytes(), writer.FormDataContentType()) } -// GetEmojiList returns a list of custom emoji in the system. -func (c *Client4) GetEmojiList() ([]*Emoji, *Response) { - if r, err := c.DoApiGet(c.GetEmojisRoute(), ""); err != nil { +// GetEmojiList returns a page of custom emoji on the system. +func (c *Client4) GetEmojiList(page, perPage int) ([]*Emoji, *Response) { + query := fmt.Sprintf("?page=%v&per_page=%v", page, perPage) + if r, err := c.DoApiGet(c.GetEmojisRoute()+query, ""); err != nil { return nil, BuildErrorResponse(r, err) } else { defer closeBody(r) diff --git a/store/sql_emoji_store.go b/store/sql_emoji_store.go index 2a8ea080e..6e50248a9 100644 --- a/store/sql_emoji_store.go +++ b/store/sql_emoji_store.go @@ -150,7 +150,7 @@ func (es SqlEmojiStore) GetByName(name string) StoreChannel { return storeChannel } -func (es SqlEmojiStore) GetAll() StoreChannel { +func (es SqlEmojiStore) GetList(offset, limit int) StoreChannel { storeChannel := make(StoreChannel, 1) go func() { @@ -164,8 +164,9 @@ func (es SqlEmojiStore) GetAll() StoreChannel { FROM Emoji WHERE - DeleteAt = 0`); err != nil { - result.Err = model.NewLocAppError("SqlEmojiStore.Get", "store.sql_emoji.get_all.app_error", nil, err.Error()) + DeleteAt = 0 + LIMIT :Limit OFFSET :Offset`, 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/sql_emoji_store_test.go b/store/sql_emoji_store_test.go index 09cdbeead..25e0f7916 100644 --- a/store/sql_emoji_store_test.go +++ b/store/sql_emoji_store_test.go @@ -126,7 +126,7 @@ func TestEmojiGetByName(t *testing.T) { } } -func TestEmojiGetAll(t *testing.T) { +func TestEmojiGetList(t *testing.T) { Setup() emojis := []model.Emoji{ @@ -153,7 +153,7 @@ func TestEmojiGetAll(t *testing.T) { } }() - if result := <-store.Emoji().GetAll(); result.Err != nil { + if result := <-store.Emoji().GetList(0, 100); result.Err != nil { t.Fatal(result.Err) } else { for _, emoji := range emojis { diff --git a/store/store.go b/store/store.go index 9ae5f4b81..0007f495e 100644 --- a/store/store.go +++ b/store/store.go @@ -349,7 +349,7 @@ type EmojiStore interface { Save(emoji *model.Emoji) StoreChannel Get(id string, allowFromCache bool) StoreChannel GetByName(name string) StoreChannel - GetAll() StoreChannel + GetList(offset, limit int) StoreChannel Delete(id string, time int64) StoreChannel } -- cgit v1.2.3-1-g7c22