Add SetProfileImage for plugin API (#9831)

Этот коммит содержится в:
Carlos Tadeu Panato Junior
2018-11-15 21:23:03 +01:00
коммит произвёл Hanzei
родитель f0351f23f1
Коммит b29f1cb844
7 изменённых файлов: 136 добавлений и 34 удалений

Просмотреть файл

@@ -492,7 +492,7 @@ func (a *App) ImportUser(data *UserImportData, dryRun bool) *model.AppError {
if err != nil {
mlog.Error("Unable to open the profile image.", mlog.Any("err", err))
}
if err := a.SetProfileImageFromFile(savedUser.Id, file); err != nil {
if err := a.SetProfileImageFromMultiPartFile(savedUser.Id, file); err != nil {
mlog.Error("Unable to set the profile image from a file.", mlog.Any("err", err))
}
}

Просмотреть файл

@@ -4,6 +4,7 @@
package app
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
@@ -389,6 +390,20 @@ func (api *PluginAPI) GetProfileImage(userId string) ([]byte, *model.AppError) {
return data, err
}
func (api *PluginAPI) SetProfileImage(userId string, data []byte) *model.AppError {
_, err := api.app.GetUser(userId)
if err != nil {
return err
}
fileReader := bytes.NewReader(data)
err = api.app.SetProfileImageFromFile(userId, fileReader)
if err != nil {
return err
}
return nil
}
func (api *PluginAPI) GetEmojiList(sortBy string, page, perPage int) ([]*model.Emoji, *model.AppError) {
return api.app.GetEmojiList(page, perPage, sortBy)
}

Просмотреть файл

@@ -4,8 +4,12 @@
package app
import (
"bytes"
"encoding/json"
"fmt"
"image"
"image/color"
"image/png"
"io/ioutil"
"os"
"path/filepath"
@@ -220,6 +224,36 @@ func TestPluginAPIGetProfileImage(t *testing.T) {
require.Nil(t, data)
}
func TestPluginAPISetProfileImage(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()
api := th.SetupPluginAPI()
// Create an 128 x 128 image
img := image.NewRGBA(image.Rect(0, 0, 128, 128))
// Draw a red dot at (2, 3)
img.Set(2, 3, color.RGBA{255, 0, 0, 255})
buf := new(bytes.Buffer)
err := png.Encode(buf, img)
require.Nil(t, err)
dataBytes := buf.Bytes()
// Set the user profile image
err = api.SetProfileImage(th.BasicUser.Id, dataBytes)
require.Nil(t, err)
// Get the user profile image to check
imageProfile, err := api.GetProfileImage(th.BasicUser.Id)
require.Nil(t, err)
require.NotEmpty(t, imageProfile)
colorful := color.NRGBA{255, 0, 0, 255}
byteReader := bytes.NewReader(imageProfile)
img2, _, err2 := image.Decode(byteReader)
require.Nil(t, err2)
require.Equal(t, img2.At(2, 3), colorful)
}
func TestPluginAPIGetPlugins(t *testing.T) {
th := Setup().InitBasic()
defer th.TearDown()

Просмотреть файл

@@ -801,10 +801,10 @@ func (a *App) SetProfileImage(userId string, imageData *multipart.FileHeader) *m
return model.NewAppError("SetProfileImage", "api.user.upload_profile_user.open.app_error", nil, err.Error(), http.StatusBadRequest)
}
defer file.Close()
return a.SetProfileImageFromFile(userId, file)
return a.SetProfileImageFromMultiPartFile(userId, file)
}
func (a *App) SetProfileImageFromFile(userId string, file multipart.File) *model.AppError {
func (a *App) SetProfileImageFromMultiPartFile(userId string, file multipart.File) *model.AppError {
// Decode image config first to check dimensions before loading the whole thing into memory later on
config, _, err := image.DecodeConfig(file)
if err != nil {
@@ -816,14 +816,17 @@ func (a *App) SetProfileImageFromFile(userId string, file multipart.File) *model
file.Seek(0, 0)
return a.SetProfileImageFromFile(userId, file)
}
func (a *App) SetProfileImageFromFile(userId string, file io.Reader) *model.AppError {
// Decode image into Image object
img, _, err := image.Decode(file)
if err != nil {
return model.NewAppError("SetProfileImage", "api.user.upload_profile_user.decode.app_error", nil, err.Error(), http.StatusBadRequest)
}
file.Seek(0, 0)
orientation, _ := getImageOrientation(file)
img = makeImageUpright(img, orientation)