github.com/gigforks/mattermost-server@v4.9.1-0.20180619094218-800d97fa55d0+incompatible/api4/emoji.go (about) 1 // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package api4 5 6 import ( 7 "net/http" 8 "strings" 9 10 "github.com/mattermost/mattermost-server/app" 11 "github.com/mattermost/mattermost-server/model" 12 ) 13 14 const ( 15 EMOJI_MAX_AUTOCOMPLETE_ITEMS = 100 16 ) 17 18 func (api *API) InitEmoji() { 19 api.BaseRoutes.Emojis.Handle("", api.ApiSessionRequired(createEmoji)).Methods("POST") 20 api.BaseRoutes.Emojis.Handle("", api.ApiSessionRequired(getEmojiList)).Methods("GET") 21 api.BaseRoutes.Emojis.Handle("/search", api.ApiSessionRequired(searchEmojis)).Methods("POST") 22 api.BaseRoutes.Emojis.Handle("/autocomplete", api.ApiSessionRequired(autocompleteEmojis)).Methods("GET") 23 api.BaseRoutes.Emoji.Handle("", api.ApiSessionRequired(deleteEmoji)).Methods("DELETE") 24 api.BaseRoutes.Emoji.Handle("", api.ApiSessionRequired(getEmoji)).Methods("GET") 25 api.BaseRoutes.EmojiByName.Handle("", api.ApiSessionRequired(getEmojiByName)).Methods("GET") 26 api.BaseRoutes.Emoji.Handle("/image", api.ApiSessionRequiredTrustRequester(getEmojiImage)).Methods("GET") 27 } 28 29 func createEmoji(c *Context, w http.ResponseWriter, r *http.Request) { 30 if !*c.App.Config().ServiceSettings.EnableCustomEmoji { 31 c.Err = model.NewAppError("createEmoji", "api.emoji.disabled.app_error", nil, "", http.StatusNotImplemented) 32 return 33 } 34 35 if emojiInterface := c.App.Emoji; emojiInterface != nil && 36 !emojiInterface.CanUserCreateEmoji(c.Session.Roles, c.Session.TeamMembers) { 37 c.Err = model.NewAppError("getEmoji", "api.emoji.disabled.app_error", nil, "user_id="+c.Session.UserId, http.StatusUnauthorized) 38 return 39 } 40 41 if len(*c.App.Config().FileSettings.DriverName) == 0 { 42 c.Err = model.NewAppError("createEmoji", "api.emoji.storage.app_error", nil, "", http.StatusNotImplemented) 43 return 44 } 45 46 if r.ContentLength > app.MaxEmojiFileSize { 47 c.Err = model.NewAppError("createEmoji", "api.emoji.create.too_large.app_error", nil, "", http.StatusRequestEntityTooLarge) 48 return 49 } 50 51 if err := r.ParseMultipartForm(app.MaxEmojiFileSize); err != nil { 52 c.Err = model.NewAppError("createEmoji", "api.emoji.create.parse.app_error", nil, err.Error(), http.StatusBadRequest) 53 return 54 } 55 56 m := r.MultipartForm 57 props := m.Value 58 59 if len(props["emoji"]) == 0 { 60 c.SetInvalidParam("emoji") 61 return 62 } 63 64 emoji := model.EmojiFromJson(strings.NewReader(props["emoji"][0])) 65 if emoji == nil { 66 c.SetInvalidParam("emoji") 67 return 68 } 69 70 newEmoji, err := c.App.CreateEmoji(c.Session.UserId, emoji, m) 71 if err != nil { 72 c.Err = err 73 return 74 } else { 75 w.Write([]byte(newEmoji.ToJson())) 76 } 77 } 78 79 func getEmojiList(c *Context, w http.ResponseWriter, r *http.Request) { 80 if !*c.App.Config().ServiceSettings.EnableCustomEmoji { 81 c.Err = model.NewAppError("getEmoji", "api.emoji.disabled.app_error", nil, "", http.StatusNotImplemented) 82 return 83 } 84 85 sort := r.URL.Query().Get("sort") 86 if sort != "" && sort != model.EMOJI_SORT_BY_NAME { 87 c.SetInvalidUrlParam("sort") 88 return 89 } 90 91 listEmoji, err := c.App.GetEmojiList(c.Params.Page, c.Params.PerPage, sort) 92 if err != nil { 93 c.Err = err 94 return 95 } else { 96 w.Write([]byte(model.EmojiListToJson(listEmoji))) 97 } 98 } 99 100 func deleteEmoji(c *Context, w http.ResponseWriter, r *http.Request) { 101 c.RequireEmojiId() 102 if c.Err != nil { 103 return 104 } 105 106 emoji, err := c.App.GetEmoji(c.Params.EmojiId) 107 if err != nil { 108 c.Err = err 109 return 110 } 111 112 if c.Session.UserId != emoji.CreatorId && !c.App.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) { 113 c.Err = model.NewAppError("deleteImage", "api.emoji.delete.permissions.app_error", nil, "user_id="+c.Session.UserId, http.StatusUnauthorized) 114 return 115 } 116 117 err = c.App.DeleteEmoji(emoji) 118 if err != nil { 119 c.Err = err 120 return 121 } else { 122 ReturnStatusOK(w) 123 } 124 } 125 126 func getEmoji(c *Context, w http.ResponseWriter, r *http.Request) { 127 c.RequireEmojiId() 128 if c.Err != nil { 129 return 130 } 131 132 if !*c.App.Config().ServiceSettings.EnableCustomEmoji { 133 c.Err = model.NewAppError("getEmoji", "api.emoji.disabled.app_error", nil, "", http.StatusNotImplemented) 134 return 135 } 136 137 emoji, err := c.App.GetEmoji(c.Params.EmojiId) 138 if err != nil { 139 c.Err = err 140 return 141 } else { 142 w.Write([]byte(emoji.ToJson())) 143 } 144 } 145 146 func getEmojiByName(c *Context, w http.ResponseWriter, r *http.Request) { 147 c.RequireEmojiName() 148 if c.Err != nil { 149 return 150 } 151 152 emoji, err := c.App.GetEmojiByName(c.Params.EmojiName) 153 if err != nil { 154 c.Err = err 155 return 156 } else { 157 w.Write([]byte(emoji.ToJson())) 158 } 159 } 160 161 func getEmojiImage(c *Context, w http.ResponseWriter, r *http.Request) { 162 c.RequireEmojiId() 163 if c.Err != nil { 164 return 165 } 166 167 if !*c.App.Config().ServiceSettings.EnableCustomEmoji { 168 c.Err = model.NewAppError("getEmojiImage", "api.emoji.disabled.app_error", nil, "", http.StatusNotImplemented) 169 return 170 } 171 172 if len(*c.App.Config().FileSettings.DriverName) == 0 { 173 c.Err = model.NewAppError("getEmojiImage", "api.emoji.storage.app_error", nil, "", http.StatusNotImplemented) 174 return 175 } 176 177 image, imageType, err := c.App.GetEmojiImage(c.Params.EmojiId) 178 if err != nil { 179 c.Err = err 180 return 181 } 182 183 w.Header().Set("Content-Type", "image/"+imageType) 184 w.Header().Set("Cache-Control", "max-age=2592000, public") 185 w.Write(image) 186 } 187 188 func searchEmojis(c *Context, w http.ResponseWriter, r *http.Request) { 189 emojiSearch := model.EmojiSearchFromJson(r.Body) 190 if emojiSearch == nil { 191 c.SetInvalidParam("term") 192 return 193 } 194 195 if emojiSearch.Term == "" { 196 c.SetInvalidParam("term") 197 return 198 } 199 200 emojis, err := c.App.SearchEmoji(emojiSearch.Term, emojiSearch.PrefixOnly, PER_PAGE_MAXIMUM) 201 if err != nil { 202 c.Err = err 203 return 204 } else { 205 w.Write([]byte(model.EmojiListToJson(emojis))) 206 } 207 } 208 209 func autocompleteEmojis(c *Context, w http.ResponseWriter, r *http.Request) { 210 name := r.URL.Query().Get("name") 211 212 if name == "" { 213 c.SetInvalidUrlParam("name") 214 return 215 } 216 217 emojis, err := c.App.SearchEmoji(name, true, EMOJI_MAX_AUTOCOMPLETE_ITEMS) 218 if err != nil { 219 c.Err = err 220 return 221 } else { 222 w.Write([]byte(model.EmojiListToJson(emojis))) 223 } 224 }