diff --git a/data/user.go b/data/user.go index ea7fd30..c5da81e 100644 --- a/data/user.go +++ b/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) }) } diff --git a/service/service_user/get_user_info.go b/service/service_user/get_user_info.go index c60e3d4..05c1011 100644 --- a/service/service_user/get_user_info.go +++ b/service/service_user/get_user_info.go @@ -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, }, } diff --git a/service/service_user/update_user_info.go b/service/service_user/update_user_info.go index 43b4836..4920407 100644 --- a/service/service_user/update_user_info.go +++ b/service/service_user/update_user_info.go @@ -1,6 +1,7 @@ package service_user import ( + "log/slog" "net/url" "nixcn-cms/data" "nixcn-cms/internal/cryptography" @@ -12,15 +13,36 @@ 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). + SetType(exception.TypeCommon). + SetOriginal(exception.CommonErrorInvalidInput) + + result = &UserInfoResult{ + Common: shared.CommonResult{ + HttpCode: 400, + Exception: execption, + }, + Data: nil, + } + + return + } + } + updates["username"] = *payload.Data.Username + } + + 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). @@ -37,52 +59,35 @@ func (self *UserServiceImpl) UpdateUserInfo(payload *UserInfoPayload) (result *U return } - userData.SetUsername(payload.Data.Username) + updates["nickname"] = *payload.Data.Nickname } - if utf8.RuneCountInString(payload.Data.Nickname) > 24 { - execption := new(exception.Builder). - SetStatus(exception.StatusUser). - SetService(exception.ServiceUser). - SetType(exception.TypeCommon). - SetOriginal(exception.CommonErrorInvalidInput) + if payload.Data.Subtitle != nil { + if utf8.RuneCountInString(*payload.Data.Subtitle) > 32 { + execption := new(exception.Builder). + SetStatus(exception.StatusUser). + SetService(exception.ServiceUser). + SetEndpoint(exception.EndpointUserServiceUpdate). + SetType(exception.TypeCommon). + SetOriginal(exception.CommonErrorInvalidInput). + SetError(nil). + Throw(payload.Context) - result = &UserInfoResult{ - Common: shared.CommonResult{ - HttpCode: 400, - Exception: execption, - }, - Data: nil, + result = &UserInfoResult{ + Common: shared.CommonResult{ + HttpCode: 400, + Exception: execption, + }, + Data: nil, + } + + return } - - return + updates["subtitle"] = *payload.Data.Subtitle } - userData.SetNickname(payload.Data.Nickname) - if utf8.RuneCountInString(payload.Data.Subtitle) > 32 { - execption := new(exception.Builder). - SetStatus(exception.StatusUser). - SetService(exception.ServiceUser). - SetEndpoint(exception.EndpointUserServiceUpdate). - SetType(exception.TypeCommon). - SetOriginal(exception.CommonErrorInvalidInput). - SetError(nil). - Throw(payload.Context) - - result = &UserInfoResult{ - Common: shared.CommonResult{ - HttpCode: 400, - Exception: execption, - }, - Data: nil, - } - - return - } - userData.SetSubtitle(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,38 +108,62 @@ 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) { - execption := new(exception.Builder). - SetStatus(exception.StatusUser). - SetService(exception.ServiceUser). - SetEndpoint(exception.EndpointUserServiceUpdate). - SetType(exception.TypeCommon). - SetOriginal(exception.CommonErrorInvalidInput). - SetError(nil). - Throw(payload.Context) + 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). + SetEndpoint(exception.EndpointUserServiceUpdate). + SetType(exception.TypeCommon). + SetOriginal(exception.CommonErrorInvalidInput). + SetError(nil). + Throw(payload.Context) - result = &UserInfoResult{ - Common: shared.CommonResult{ - HttpCode: 400, - Exception: execption, - }, - Data: nil, + result = &UserInfoResult{ + Common: shared.CommonResult{ + HttpCode: 400, + Exception: execption, + }, + Data: nil, + } + + return } - - 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).