From f758f9ff3a617dd5939e1e7851fdbe10d03cd5a8 Mon Sep 17 00:00:00 2001 From: Carlos Tadeu Panato Junior Date: Thu, 20 Apr 2017 17:14:15 +0200 Subject: [APIV4] GET /emoji/{emoji_id}/image for apiV4 (#6141) * implement GET /emoji/{emoji_id}/image for apiV4 * update per request --- api4/emoji.go | 28 ++++++++++++ api4/emoji_test.go | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 149 insertions(+), 1 deletion(-) (limited to 'api4') diff --git a/api4/emoji.go b/api4/emoji.go index ff4919860..a9bfae924 100644 --- a/api4/emoji.go +++ b/api4/emoji.go @@ -22,6 +22,7 @@ func InitEmoji() { BaseRoutes.Emojis.Handle("", ApiSessionRequired(getEmojiList)).Methods("GET") BaseRoutes.Emoji.Handle("", ApiSessionRequired(deleteEmoji)).Methods("DELETE") BaseRoutes.Emoji.Handle("", ApiSessionRequired(getEmoji)).Methods("GET") + BaseRoutes.Emoji.Handle("/image", ApiSessionRequiredTrustRequester(getEmojiImage)).Methods("GET") } func createEmoji(c *Context, w http.ResponseWriter, r *http.Request) { @@ -129,3 +130,30 @@ func getEmoji(c *Context, w http.ResponseWriter, r *http.Request) { w.Write([]byte(emoji.ToJson())) } } + +func getEmojiImage(c *Context, w http.ResponseWriter, r *http.Request) { + c.RequireEmojiId() + if c.Err != nil { + return + } + + if !*utils.Cfg.ServiceSettings.EnableCustomEmoji { + c.Err = model.NewAppError("getEmojiImage", "api.emoji.disabled.app_error", nil, "", http.StatusNotImplemented) + return + } + + if len(utils.Cfg.FileSettings.DriverName) == 0 { + c.Err = model.NewAppError("getEmojiImage", "api.emoji.storage.app_error", nil, "", http.StatusNotImplemented) + return + } + + image, imageType, err := app.GetEmojiImage(c.Params.EmojiId) + if err != nil { + c.Err = err + return + } + + w.Header().Set("Content-Type", "image/"+imageType) + w.Header().Set("Cache-Control", "max-age=2592000, public") + w.Write(image) +} diff --git a/api4/emoji_test.go b/api4/emoji_test.go index 23188a3d2..84d808e6d 100644 --- a/api4/emoji_test.go +++ b/api4/emoji_test.go @@ -4,6 +4,9 @@ package api4 import ( + "bytes" + "image" + _ "image/gif" "testing" "github.com/mattermost/platform/model" @@ -199,7 +202,6 @@ func TestGetEmojiList(t *testing.T) { t.Fatalf("should not get a deleted emoji %v", emojis[0].Id) } } - } func TestDeleteEmoji(t *testing.T) { @@ -296,5 +298,123 @@ func TestGetEmoji(t *testing.T) { _, resp = Client.GetEmoji(model.NewId()) CheckInternalErrorStatus(t, resp) +} + +func TestGetEmojiImage(t *testing.T) { + th := Setup().InitBasic() + defer TearDown() + Client := th.Client + + EnableCustomEmoji := *utils.Cfg.ServiceSettings.EnableCustomEmoji + DriverName := utils.Cfg.FileSettings.DriverName + defer func() { + *utils.Cfg.ServiceSettings.EnableCustomEmoji = EnableCustomEmoji + utils.Cfg.FileSettings.DriverName = DriverName + }() + *utils.Cfg.ServiceSettings.EnableCustomEmoji = true + + emoji1 := &model.Emoji{ + CreatorId: th.BasicUser.Id, + Name: model.NewId(), + } + + emoji1, resp := Client.CreateEmoji(emoji1, utils.CreateTestGif(t, 10, 10), "image.gif") + CheckNoError(t, resp) + + *utils.Cfg.ServiceSettings.EnableCustomEmoji = false + + _, resp = Client.GetEmojiImage(emoji1.Id) + CheckNotImplementedStatus(t, resp) + CheckErrorMessage(t, resp, "api.emoji.disabled.app_error") + + utils.Cfg.FileSettings.DriverName = "" + *utils.Cfg.ServiceSettings.EnableCustomEmoji = true + + _, resp = Client.GetEmojiImage(emoji1.Id) + CheckNotImplementedStatus(t, resp) + CheckErrorMessage(t, resp, "api.emoji.storage.app_error") + utils.Cfg.FileSettings.DriverName = DriverName + + emojiImage, resp := Client.GetEmojiImage(emoji1.Id) + CheckNoError(t, resp) + if len(emojiImage) <= 0 { + t.Fatal("should return the image") + } + _, imageType, err := image.DecodeConfig(bytes.NewReader(emojiImage)) + if err != nil { + t.Fatalf("unable to identify received image: %v", err.Error()) + } else if imageType != "gif" { + t.Fatal("should've received gif data") + } + + emoji2 := &model.Emoji{ + CreatorId: th.BasicUser.Id, + Name: model.NewId(), + } + + emoji2, resp = Client.CreateEmoji(emoji2, utils.CreateTestAnimatedGif(t, 10, 10, 10), "image.gif") + CheckNoError(t, resp) + + emojiImage, resp = Client.GetEmojiImage(emoji2.Id) + CheckNoError(t, resp) + if len(emojiImage) <= 0 { + t.Fatal("should return the image") + } + _, imageType, err = image.DecodeConfig(bytes.NewReader(emojiImage)) + if err != nil { + t.Fatalf("unable to identify received image: %v", err.Error()) + } else if imageType != "gif" { + t.Fatal("should've received gif data") + } + + emoji3 := &model.Emoji{ + CreatorId: th.BasicUser.Id, + Name: model.NewId(), + } + emoji3, resp = Client.CreateEmoji(emoji3, utils.CreateTestJpeg(t, 10, 10), "image.jpg") + CheckNoError(t, resp) + + emojiImage, resp = Client.GetEmojiImage(emoji3.Id) + CheckNoError(t, resp) + if len(emojiImage) <= 0 { + t.Fatal("should return the image") + } + _, imageType, err = image.DecodeConfig(bytes.NewReader(emojiImage)) + if err != nil { + t.Fatalf("unable to identify received image: %v", err.Error()) + } else if imageType != "jpeg" { + t.Fatal("should've received gif data") + } + + emoji4 := &model.Emoji{ + CreatorId: th.BasicUser.Id, + Name: model.NewId(), + } + emoji4, resp = Client.CreateEmoji(emoji4, utils.CreateTestPng(t, 10, 10), "image.png") + CheckNoError(t, resp) + + emojiImage, resp = Client.GetEmojiImage(emoji4.Id) + CheckNoError(t, resp) + if len(emojiImage) <= 0 { + t.Fatal("should return the image") + } + _, imageType, err = image.DecodeConfig(bytes.NewReader(emojiImage)) + if err != nil { + t.Fatalf("unable to identify received image: %v", err.Error()) + } else if imageType != "png" { + t.Fatal("should've received gif data") + } + + _, resp = Client.DeleteEmoji(emoji4.Id) + CheckNoError(t, resp) + + _, resp = Client.GetEmojiImage(emoji4.Id) + CheckNotFoundStatus(t, resp) + + _, resp = Client.GetEmojiImage(model.NewId()) + CheckInternalErrorStatus(t, resp) + + _, resp = Client.GetEmojiImage("") + CheckBadRequestStatus(t, resp) } -- cgit v1.2.3-1-g7c22