|
6 | 6 | "encoding/json" |
7 | 7 | "errors" |
8 | 8 | "fmt" |
| 9 | + "io" |
9 | 10 | "net/http" |
10 | 11 | "net/url" |
11 | 12 | "strings" |
@@ -253,6 +254,31 @@ func isMovedError(err error) bool { |
253 | 254 | return ok && j.Code == "moved" |
254 | 255 | } |
255 | 256 |
|
| 257 | +func (h *HTTPHandler) UploadAvatar(c echo.Context) error { |
| 258 | + inst := middlewares.GetInstance(c) |
| 259 | + if err := middlewares.AllowWholeType(c, http.MethodPut, consts.Settings); err != nil { |
| 260 | + return err |
| 261 | + } |
| 262 | + header := c.Request().Header |
| 263 | + size := c.Request().ContentLength |
| 264 | + if size > 20_000_000 { |
| 265 | + return jsonapi.Errorf(http.StatusRequestEntityTooLarge, "Avatar is too big") |
| 266 | + } |
| 267 | + contentType := header.Get(echo.HeaderContentType) |
| 268 | + f, err := inst.AvatarFS().CreateAvatar(contentType) |
| 269 | + if err != nil { |
| 270 | + return jsonapi.InternalServerError(err) |
| 271 | + } |
| 272 | + _, err = io.Copy(f, c.Request().Body) |
| 273 | + if cerr := f.Close(); cerr != nil && err == nil { |
| 274 | + err = cerr |
| 275 | + } |
| 276 | + if err != nil { |
| 277 | + return jsonapi.InternalServerError(err) |
| 278 | + } |
| 279 | + return c.NoContent(http.StatusNoContent) |
| 280 | +} |
| 281 | + |
256 | 282 | // Register all the `/settings` routes to the given router. |
257 | 283 | func (h *HTTPHandler) Register(router *echo.Group) { |
258 | 284 | router.GET("/disk-usage", h.diskUsage) |
@@ -281,6 +307,8 @@ func (h *HTTPHandler) Register(router *echo.Group) { |
281 | 307 | router.PUT("/instance/sign_tos", h.updateInstanceTOS) |
282 | 308 | router.DELETE("/instance/moved_from", h.clearMovedFrom) |
283 | 309 |
|
| 310 | + router.PUT("/avatar", h.UploadAvatar) |
| 311 | + |
284 | 312 | router.GET("/flags", h.getFlags) |
285 | 313 |
|
286 | 314 | router.GET("/sessions", h.getSessions) |
|
0 commit comments