Merge pull request #40 from mattermost/image-fix

HELIUM profile image now generates on each call if S3 is not configured
Этот коммит содержится в:
Corey Hulen
2015-06-19 10:41:56 -08:00
родитель 98d9050d07 a76ee16480
Коммит 8291cb772c
2 изменённых файлов: 50 добавлений и 37 удалений

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

@@ -567,7 +567,7 @@ func getAudits(c *Context, w http.ResponseWriter, r *http.Request) {
} }
} }
func createProfileImage(username string, userId string) *image.RGBA { func createProfileImage(username string, userId string) ([]byte, *model.AppError) {
colors := []color.NRGBA{ colors := []color.NRGBA{
{197, 8, 126, 255}, {197, 8, 126, 255},
@@ -634,22 +634,33 @@ func createProfileImage(username string, userId string) *image.RGBA {
gc.Translate(width, height) gc.Translate(width, height)
gc.SetFillColor(image.White) gc.SetFillColor(image.White)
gc.FillString(initials) gc.FillString(initials)
return i
buf := new(bytes.Buffer)
if imgErr := png.Encode(buf, i); imgErr != nil {
return nil, model.NewAppError("getProfileImage", "Could not encode default profile image", imgErr.Error())
} else {
return buf.Bytes(), nil
}
} }
func getProfileImage(c *Context, w http.ResponseWriter, r *http.Request) { func getProfileImage(c *Context, w http.ResponseWriter, r *http.Request) {
if !utils.IsS3Configured() {
c.Err = model.NewAppError("getProfileImage", "Unable to get image. Amazon S3 not configured. ", "")
c.Err.StatusCode = http.StatusNotImplemented
return
}
params := mux.Vars(r) params := mux.Vars(r)
id := params["id"] id := params["id"]
if result := <-Srv.Store.User().Get(id); result.Err != nil { if result := <-Srv.Store.User().Get(id); result.Err != nil {
c.Err = result.Err c.Err = result.Err
return return
} else {
var img []byte
var err *model.AppError
if !utils.IsS3Configured() {
img, err = createProfileImage(result.Data.(*model.User).Username, id)
if err != nil {
c.Err = err
return
}
} else { } else {
var auth aws.Auth var auth aws.Auth
auth.AccessKey = utils.Cfg.AWSSettings.S3AccessKeyId auth.AccessKey = utils.Cfg.AWSSettings.S3AccessKeyId
@@ -660,21 +671,15 @@ func getProfileImage(c *Context, w http.ResponseWriter, r *http.Request) {
path := "teams/" + c.Session.TeamId + "/users/" + id + "/profile.png" path := "teams/" + c.Session.TeamId + "/users/" + id + "/profile.png"
var img []byte
if data, getErr := bucket.Get(path); getErr != nil { if data, getErr := bucket.Get(path); getErr != nil {
rawImg := createProfileImage(result.Data.(*model.User).Username, id) img, err = createProfileImage(result.Data.(*model.User).Username, id)
buf := new(bytes.Buffer) if err != nil {
c.Err = err
if imgErr := png.Encode(buf, rawImg); imgErr != nil {
c.Err = model.NewAppError("getProfileImage", "Could not encode default profile image", imgErr.Error())
return return
} else {
img = buf.Bytes()
} }
options := s3.Options{} options := s3.Options{}
if err := bucket.Put(path, buf.Bytes(), "image", s3.Private, options); err != nil { if err := bucket.Put(path, img, "image", s3.Private, options); err != nil {
c.Err = model.NewAppError("getImage", "Couldn't upload default profile image", err.Error()) c.Err = model.NewAppError("getImage", "Couldn't upload default profile image", err.Error())
return return
} }
@@ -682,6 +687,7 @@ func getProfileImage(c *Context, w http.ResponseWriter, r *http.Request) {
} else { } else {
img = data img = data
} }
}
if c.Session.UserId == id { if c.Session.UserId == id {
w.Header().Set("Cache-Control", "max-age=300, public") // 5 mins w.Header().Set("Cache-Control", "max-age=300, public") // 5 mins

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

@@ -10,6 +10,7 @@ import (
"github.com/goamz/goamz/s3" "github.com/goamz/goamz/s3"
"github.com/mattermost/platform/model" "github.com/mattermost/platform/model"
"github.com/mattermost/platform/utils" "github.com/mattermost/platform/utils"
"image"
"image/color" "image/color"
"io" "io"
"mime/multipart" "mime/multipart"
@@ -324,14 +325,20 @@ func TestGetAudits(t *testing.T) {
func TestUserCreateImage(t *testing.T) { func TestUserCreateImage(t *testing.T) {
Setup() Setup()
i := createProfileImage("Corey Hulen", "eo1zkdr96pdj98pjmq8zy35wba") b, err := createProfileImage("Corey Hulen", "eo1zkdr96pdj98pjmq8zy35wba")
if i == nil { if err != nil {
t.Fatal("Failed to gen image") t.Fatal(err)
}
rdr := bytes.NewReader(b)
img, _, err2 := image.Decode(rdr)
if err2 != nil {
t.Fatal(err)
} }
colorful := color.RGBA{116, 49, 196, 255} colorful := color.RGBA{116, 49, 196, 255}
if i.RGBAAt(1, 1) != colorful { if img.At(1, 1) != colorful {
t.Fatal("Failed to create correct color") t.Fatal("Failed to create correct color")
} }