14
data/user.go
14
data/user.go
@@ -127,12 +127,20 @@ func (self *User) Create(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (self *User) UpdateByUserID(ctx context.Context, userId *uuid.UUID) error {
|
||||
func (self *User) UpdateByUserID(ctx context.Context, userId *uuid.UUID, updates map[string]any) error {
|
||||
return Database.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||||
if err := tx.Model(&User{}).Where("user_id = ?", userId).Updates(&self).Error; err != nil {
|
||||
if err := tx.Model(&User{}).
|
||||
Where("user_id = ?", userId).
|
||||
Updates(updates).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
var updatedUser User
|
||||
if err := tx.Where("user_id = ?", userId).First(&updatedUser).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return updatedUser.UpdateSearchIndex(&ctx)
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -12,13 +12,13 @@ import (
|
||||
type UserInfoData struct {
|
||||
UserId uuid.UUID `json:"user_id"`
|
||||
Email string `json:"email"`
|
||||
Username string `json:"username"`
|
||||
Nickname string `json:"nickname"`
|
||||
Subtitle string `json:"subtitle"`
|
||||
Avatar string `json:"avatar"`
|
||||
Bio string `json:"bio"`
|
||||
Username *string `json:"username"`
|
||||
Nickname *string `json:"nickname"`
|
||||
Subtitle *string `json:"subtitle"`
|
||||
Avatar *string `json:"avatar"`
|
||||
Bio *string `json:"bio"`
|
||||
PermissionLevel uint `json:"permission_level"`
|
||||
AllowPublic bool `json:"allow_public"`
|
||||
AllowPublic *bool `json:"allow_public"`
|
||||
}
|
||||
|
||||
type UserInfoPayload struct {
|
||||
@@ -80,13 +80,13 @@ func (self *UserServiceImpl) GetUserInfo(payload *UserInfoPayload) (result *User
|
||||
Data: &UserInfoData{
|
||||
UserId: userData.UserId,
|
||||
Email: userData.Email,
|
||||
Username: userData.Username,
|
||||
Nickname: userData.Nickname,
|
||||
Subtitle: userData.Subtitle,
|
||||
Avatar: userData.Avatar,
|
||||
Bio: userData.Bio,
|
||||
Username: &userData.Username,
|
||||
Nickname: &userData.Nickname,
|
||||
Subtitle: &userData.Subtitle,
|
||||
Avatar: &userData.Avatar,
|
||||
Bio: &userData.Bio,
|
||||
PermissionLevel: userData.PermissionLevel,
|
||||
AllowPublic: userData.AllowPublic,
|
||||
AllowPublic: &userData.AllowPublic,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package service_user
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
"net/url"
|
||||
"nixcn-cms/data"
|
||||
"nixcn-cms/internal/cryptography"
|
||||
@@ -12,15 +13,12 @@ import (
|
||||
func (self *UserServiceImpl) UpdateUserInfo(payload *UserInfoPayload) (result *UserInfoResult) {
|
||||
var err error
|
||||
|
||||
userData := new(data.User).
|
||||
SetNickname(payload.Data.Nickname).
|
||||
SetSubtitle(payload.Data.Subtitle).
|
||||
SetAvatar(payload.Data.Avatar).
|
||||
SetBio(payload.Data.Bio).
|
||||
SetAllowPublic(payload.Data.AllowPublic)
|
||||
updates := make(map[string]any)
|
||||
|
||||
if payload.Data.Username != "" {
|
||||
if len(payload.Data.Username) < 5 || len(payload.Data.Username) >= 255 {
|
||||
if payload.Data.Username != nil {
|
||||
val := *payload.Data.Username
|
||||
if val != "" {
|
||||
if len(*payload.Data.Username) < 5 || len(*payload.Data.Username) >= 255 {
|
||||
execption := new(exception.Builder).
|
||||
SetStatus(exception.StatusUser).
|
||||
SetService(exception.ServiceUser).
|
||||
@@ -37,10 +35,14 @@ func (self *UserServiceImpl) UpdateUserInfo(payload *UserInfoPayload) (result *U
|
||||
|
||||
return
|
||||
}
|
||||
userData.SetUsername(payload.Data.Username)
|
||||
}
|
||||
updates["username"] = *payload.Data.Username
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(payload.Data.Nickname) > 24 {
|
||||
slog.Debug("DataNickname", slog.Any("DataNickName", payload.Data.Nickname))
|
||||
|
||||
if payload.Data.Nickname != nil {
|
||||
if utf8.RuneCountInString(*payload.Data.Nickname) > 24 {
|
||||
execption := new(exception.Builder).
|
||||
SetStatus(exception.StatusUser).
|
||||
SetService(exception.ServiceUser).
|
||||
@@ -57,9 +59,11 @@ func (self *UserServiceImpl) UpdateUserInfo(payload *UserInfoPayload) (result *U
|
||||
|
||||
return
|
||||
}
|
||||
userData.SetNickname(payload.Data.Nickname)
|
||||
updates["nickname"] = *payload.Data.Nickname
|
||||
}
|
||||
|
||||
if utf8.RuneCountInString(payload.Data.Subtitle) > 32 {
|
||||
if payload.Data.Subtitle != nil {
|
||||
if utf8.RuneCountInString(*payload.Data.Subtitle) > 32 {
|
||||
execption := new(exception.Builder).
|
||||
SetStatus(exception.StatusUser).
|
||||
SetService(exception.ServiceUser).
|
||||
@@ -79,10 +83,11 @@ func (self *UserServiceImpl) UpdateUserInfo(payload *UserInfoPayload) (result *U
|
||||
|
||||
return
|
||||
}
|
||||
userData.SetSubtitle(payload.Data.Subtitle)
|
||||
updates["subtitle"] = *payload.Data.Subtitle
|
||||
}
|
||||
|
||||
if payload.Data.Avatar != "" {
|
||||
_, err := url.ParseRequestURI(payload.Data.Avatar)
|
||||
if payload.Data.Avatar != nil {
|
||||
_, err := url.ParseRequestURI(*payload.Data.Avatar)
|
||||
if err != nil {
|
||||
execption := new(exception.Builder).
|
||||
SetStatus(exception.StatusUser).
|
||||
@@ -103,13 +108,13 @@ func (self *UserServiceImpl) UpdateUserInfo(payload *UserInfoPayload) (result *U
|
||||
|
||||
return
|
||||
}
|
||||
userData.SetAvatar(payload.Data.Avatar)
|
||||
} else if payload.Data.Avatar == "" {
|
||||
userData.SetAvatar("")
|
||||
updates["avatar"] = *payload.Data.Avatar
|
||||
}
|
||||
|
||||
if payload.Data.Bio != "" {
|
||||
if !cryptography.IsBase64Std(payload.Data.Bio) {
|
||||
if payload.Data.Bio != nil {
|
||||
val := *payload.Data.Bio
|
||||
if val != "" {
|
||||
if !cryptography.IsBase64Std(*payload.Data.Bio) {
|
||||
execption := new(exception.Builder).
|
||||
SetStatus(exception.StatusUser).
|
||||
SetService(exception.ServiceUser).
|
||||
@@ -129,12 +134,36 @@ func (self *UserServiceImpl) UpdateUserInfo(payload *UserInfoPayload) (result *U
|
||||
|
||||
return
|
||||
}
|
||||
userData.SetBio(payload.Data.Bio)
|
||||
} else if payload.Data.Bio == "" {
|
||||
userData.SetBio("")
|
||||
}
|
||||
updates["bio"] = *payload.Data.Bio
|
||||
}
|
||||
|
||||
err = userData.UpdateByUserID(payload.Context, &payload.UserId)
|
||||
if payload.Data.AllowPublic != nil {
|
||||
updates["allow_public"] = *payload.Data.AllowPublic
|
||||
}
|
||||
|
||||
if len(updates) == 0 {
|
||||
exception := new(exception.Builder).
|
||||
SetStatus(exception.StatusUser).
|
||||
SetService(exception.ServiceUser).
|
||||
SetEndpoint(exception.EndpointUserServiceUpdate).
|
||||
SetType(exception.TypeCommon).
|
||||
SetOriginal(exception.CommonSuccess).
|
||||
SetError(nil).
|
||||
Throw(payload.Context)
|
||||
|
||||
result = &UserInfoResult{
|
||||
Common: shared.CommonResult{
|
||||
HttpCode: 200,
|
||||
Exception: exception,
|
||||
},
|
||||
Data: nil,
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
err = new(data.User).UpdateByUserID(payload.Context, &payload.UserId, updates)
|
||||
if err != nil {
|
||||
exception := new(exception.Builder).
|
||||
SetStatus(exception.StatusServer).
|
||||
|
||||
Reference in New Issue
Block a user