Decouple emailservice from app package (#17827)
* decouple emailservice from app package * fix some escaped errors * move email package under app directory * fix i18n * reflect review comments
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
a78a7c7b54
Коммит
41dc05a6bd
@@ -10,13 +10,16 @@ import (
|
||||
"image/color"
|
||||
"image/draw"
|
||||
"image/png"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/golang/freetype"
|
||||
"github.com/golang/freetype/truetype"
|
||||
"github.com/mattermost/mattermost-server/v5/model"
|
||||
"github.com/mattermost/mattermost-server/v5/shared/filestore"
|
||||
"github.com/mattermost/mattermost-server/v5/utils/fileutils"
|
||||
)
|
||||
|
||||
@@ -24,6 +27,68 @@ const (
|
||||
imageProfilePixelDimension = 128
|
||||
)
|
||||
|
||||
func (us *UserService) GetProfileImage(user *model.User) ([]byte, bool, error) {
|
||||
if *us.config().FileSettings.DriverName == "" {
|
||||
img, err := us.GetDefaultProfileImage(user)
|
||||
if err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
return img, false, nil
|
||||
}
|
||||
|
||||
path := path.Join("users", user.Id, "profile.png")
|
||||
data, err := us.ReadFile(path)
|
||||
if err != nil {
|
||||
img, appErr := us.GetDefaultProfileImage(user)
|
||||
if appErr != nil {
|
||||
return nil, false, appErr
|
||||
}
|
||||
|
||||
if user.LastPictureUpdate == 0 {
|
||||
if _, err := us.writeFile(bytes.NewReader(img), path); err != nil {
|
||||
return nil, false, err
|
||||
}
|
||||
}
|
||||
return img, true, nil
|
||||
}
|
||||
|
||||
return data, false, nil
|
||||
}
|
||||
|
||||
func (us *UserService) FileBackend() (filestore.FileBackend, error) {
|
||||
license := us.license()
|
||||
backend, err := filestore.NewFileBackend(us.config().FileSettings.ToFileBackendSettings(license != nil && *license.Features.Compliance))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return backend, nil
|
||||
}
|
||||
|
||||
func (us *UserService) ReadFile(path string) ([]byte, error) {
|
||||
backend, err := us.FileBackend()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
result, nErr := backend.ReadFile(path)
|
||||
if nErr != nil {
|
||||
return nil, nErr
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (us *UserService) writeFile(fr io.Reader, path string) (int64, error) {
|
||||
backend, err := us.FileBackend()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
result, nErr := backend.WriteFile(fr, path)
|
||||
if nErr != nil {
|
||||
return result, nErr
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (us *UserService) GetDefaultProfileImage(user *model.User) ([]byte, error) {
|
||||
if user.IsBot {
|
||||
return botDefaultImage, nil
|
||||
|
||||
@@ -24,6 +24,7 @@ type UserService struct {
|
||||
metrics einterfaces.MetricsInterface
|
||||
cluster einterfaces.ClusterInterface
|
||||
config func() *model.Config
|
||||
license func() *model.License
|
||||
}
|
||||
|
||||
// ServiceConfig is used to initialize the UserService.
|
||||
@@ -33,6 +34,7 @@ type ServiceConfig struct {
|
||||
SessionStore store.SessionStore
|
||||
OAuthStore store.OAuthStore
|
||||
ConfigFn func() *model.Config
|
||||
LicenseFn func() *model.License
|
||||
// Optional fields
|
||||
Metrics einterfaces.MetricsInterface
|
||||
Cluster einterfaces.ClusterInterface
|
||||
@@ -62,6 +64,7 @@ func New(c ServiceConfig) (*UserService, error) {
|
||||
sessionStore: c.SessionStore,
|
||||
oAuthStore: c.OAuthStore,
|
||||
config: c.ConfigFn,
|
||||
license: c.LicenseFn,
|
||||
metrics: c.Metrics,
|
||||
cluster: c.Cluster,
|
||||
sessionCache: sessionCache,
|
||||
@@ -74,7 +77,7 @@ func New(c ServiceConfig) (*UserService, error) {
|
||||
}
|
||||
|
||||
func (c *ServiceConfig) validate() error {
|
||||
if in := c; in.ConfigFn == nil || in.UserStore == nil || in.SessionStore == nil || in.OAuthStore == nil {
|
||||
if c.ConfigFn == nil || c.UserStore == nil || c.SessionStore == nil || c.OAuthStore == nil || c.LicenseFn == nil {
|
||||
return errors.New("required parameters are not provided")
|
||||
}
|
||||
|
||||
|
||||
@@ -20,11 +20,16 @@ func TestNew(t *testing.T) {
|
||||
return &model.Config{}
|
||||
}
|
||||
|
||||
lfn := func() *model.License {
|
||||
return model.NewTestLicense()
|
||||
}
|
||||
|
||||
_, err = New(ServiceConfig{
|
||||
UserStore: dbStore.User(),
|
||||
SessionStore: dbStore.Session(),
|
||||
OAuthStore: dbStore.OAuth(),
|
||||
ConfigFn: cfn,
|
||||
LicenseFn: lfn,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
@@ -242,3 +242,11 @@ func (us *UserService) ActivateMfa(user *model.User, token string) error {
|
||||
func (us *UserService) DeactivateMfa(user *model.User) error {
|
||||
return mfa.New(us.store).Deactivate(user.Id)
|
||||
}
|
||||
|
||||
func (us *UserService) PromoteGuestToUser(user *model.User) error {
|
||||
return us.store.PromoteGuestToUser(user.Id)
|
||||
}
|
||||
|
||||
func (us *UserService) DemoteUserToGuest(user *model.User) (*model.User, error) {
|
||||
return us.store.DemoteUserToGuest(user.Id)
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user