diff --git a/database/model/user.go b/database/model/user.go index 69bd6ec..3fafd32 100644 --- a/database/model/user.go +++ b/database/model/user.go @@ -9,7 +9,7 @@ import ( type User struct { Email string Username string - Avatar null.String + Avatar null.String `copier:"-"` Password string CreatedAt time.Time `json:"createdAt"` UpdatedAt null.Time `json:"updatedAt"` diff --git a/dto/user.go b/dto/user.go index 13d4552..d135d26 100644 --- a/dto/user.go +++ b/dto/user.go @@ -25,15 +25,15 @@ type InternalUser struct { } type RegisterUser struct { - Email string `json:"email"` - Username string `json:"username"` - Password string `json:"password" copier:"-"` - Avatar typeutil.Undefined[[]fsutil.File] `json:"avatar" copier:"-"` + Email string `json:"email"` + Username string `json:"username"` + Password string `json:"password" copier:"-"` + Avatar typeutil.Undefined[null.Value[[]fsutil.File]] `json:"avatar" copier:"-"` } type UpdateUser struct { - Email typeutil.Undefined[string] `json:"email"` - Username typeutil.Undefined[string] `json:"username"` - Password typeutil.Undefined[string] `json:"password" copier:"-"` - Avatar typeutil.Undefined[[]fsutil.File] `json:"avatar" copier:"-"` + Email typeutil.Undefined[string] `json:"email"` + Username typeutil.Undefined[string] `json:"username"` + Password typeutil.Undefined[string] `json:"password" copier:"-"` + Avatar typeutil.Undefined[null.Value[[]fsutil.File]] `json:"avatar" copier:"-"` } diff --git a/service/user/user.go b/service/user/user.go index cc9ab62..8f3c85c 100644 --- a/service/user/user.go +++ b/service/user/user.go @@ -8,6 +8,7 @@ import ( "github.com/go-goyave/goyave-blog-example/database/model" "github.com/go-goyave/goyave-blog-example/dto" "github.com/go-goyave/goyave-blog-example/service" + "github.com/guregu/null/v5" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" "goyave.dev/goyave/v5/slog" @@ -77,8 +78,8 @@ func (s *Service) Register(ctx context.Context, registerDTO *dto.RegisterUser) e } user.Password = string(b) - if registerDTO.Avatar.IsPresent() { - filename, err := s.StorageService.SaveAvatar(registerDTO.Avatar.Val[0]) + if registerDTO.Avatar.IsPresent() && registerDTO.Avatar.Val.Valid { + filename, err := s.StorageService.SaveAvatar(registerDTO.Avatar.Val.V[0]) if err != nil { return errors.New(err) } @@ -105,6 +106,25 @@ func (s *Service) Update(ctx context.Context, id uint, updateDTO *dto.UpdateUser } user = typeutil.Copy(user, updateDTO) + if updateDTO.Avatar.Present { + // Delete previous avatar + if user.Avatar.Valid { + err := s.StorageService.Delete(user.Avatar.String) + if err != nil { + return errors.New(err) + } + } + if updateDTO.Avatar.Val.Valid { + // Save new avatar + filename, err := s.StorageService.SaveAvatar(updateDTO.Avatar.Val.V[0]) + if err != nil { + return errors.New(err) + } + user.Avatar.SetValid(filename) + } else { + user.Avatar = null.String{} + } + } _, err = s.Repository.Update(ctx, user) return errors.New(err)