Fix service_user logic
Some checks failed
Backend Check Build (NixCN CMS) TeamCity build finished
Client CMS Check Build (NixCN CMS) TeamCity build failed

Signed-off-by: Asai Neko <sugar@sne.moe>
This commit is contained in:
2026-01-29 21:14:54 +08:00
parent 12a02d13dc
commit 9016b21464
3 changed files with 125 additions and 88 deletions

View File

@@ -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)
})
}

View File

@@ -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,
},
}

View File

@@ -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).