From 27f12032829a474aa5874a31e9e63bf2d7426033 Mon Sep 17 00:00:00 2001 From: shanshanzhong Date: Tue, 26 May 2026 08:35:45 -0700 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(#49):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=B8=85=E7=A9=BA=E5=A4=87=E6=B3=A8=E6=97=B6=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E4=B8=A2=E5=A4=B1=20=E2=80=94=20RefererId=20=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E6=8C=87=E9=92=88=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: multica-agent --- apis/admin/user.api | 28 +++++++------- .../admin/user/updateUserBasicInfoLogic.go | 38 ++++++++++--------- internal/types/types.go | 28 +++++++------- .../update_user_basic_info_request_test.go | 35 +++++++++++++++++ 4 files changed, 84 insertions(+), 45 deletions(-) create mode 100644 internal/types/update_user_basic_info_request_test.go diff --git a/apis/admin/user.api b/apis/admin/user.api index aa6243f..8d01bda 100644 --- a/apis/admin/user.api +++ b/apis/admin/user.api @@ -38,20 +38,20 @@ type ( Id int64 `form:"id" validate:"required"` } UpdateUserBasiceInfoRequest { - UserId int64 `json:"user_id" validate:"required"` - Password string `json:"password"` - Avatar string `json:"avatar"` - Balance int64 `json:"balance"` - Commission int64 `json:"commission"` - ReferralPercentage uint8 `json:"referral_percentage"` - OnlyFirstPurchase *bool `json:"only_first_purchase"` - GiftAmount int64 `json:"gift_amount"` - Telegram int64 `json:"telegram"` - ReferCode string `json:"refer_code"` - RefererId int64 `json:"referer_id"` - Enable *bool `json:"enable"` - IsAdmin *bool `json:"is_admin"` - Remark string `json:"remark"` + UserId int64 `json:"user_id" validate:"required"` + Password string `json:"password"` + Avatar string `json:"avatar"` + Balance *int64 `json:"balance"` + Commission *int64 `json:"commission"` + ReferralPercentage uint8 `json:"referral_percentage"` + OnlyFirstPurchase *bool `json:"only_first_purchase"` + GiftAmount *int64 `json:"gift_amount"` + Telegram int64 `json:"telegram"` + ReferCode string `json:"refer_code"` + RefererId *int64 `json:"referer_id"` + Enable *bool `json:"enable"` + IsAdmin *bool `json:"is_admin"` + Remark *string `json:"remark"` } UpdateUserNotifySettingRequest { UserId int64 `json:"user_id" validate:"required"` diff --git a/internal/logic/admin/user/updateUserBasicInfoLogic.go b/internal/logic/admin/user/updateUserBasicInfoLogic.go index 072b3d9..3d5e504 100644 --- a/internal/logic/admin/user/updateUserBasicInfoLogic.go +++ b/internal/logic/admin/user/updateUserBasicInfoLogic.go @@ -46,13 +46,13 @@ func (l *UpdateUserBasicInfoLogic) UpdateUserBasicInfo(req *types.UpdateUserBasi } err = l.svcCtx.UserModel.Transaction(l.ctx, func(tx *gorm.DB) error { - if userInfo.Balance != req.Balance { - change := req.Balance - userInfo.Balance + if req.Balance != nil && userInfo.Balance != *req.Balance { + change := *req.Balance - userInfo.Balance balanceLog := log.Balance{ Type: log.BalanceTypeAdjust, Amount: change, OrderNo: "", - Balance: req.Balance, + Balance: *req.Balance, Timestamp: time.Now().UnixMilli(), } content, _ := balanceLog.Marshal() @@ -66,14 +66,14 @@ func (l *UpdateUserBasicInfoLogic) UpdateUserBasicInfo(req *types.UpdateUserBasi if err != nil { return err } - userInfo.Balance = req.Balance + userInfo.Balance = *req.Balance } - if userInfo.GiftAmount != req.GiftAmount { - change := req.GiftAmount - userInfo.GiftAmount + if req.GiftAmount != nil && userInfo.GiftAmount != *req.GiftAmount { + change := *req.GiftAmount - userInfo.GiftAmount if change != 0 { var changeType uint16 - if userInfo.GiftAmount < req.GiftAmount { + if userInfo.GiftAmount < *req.GiftAmount { changeType = log.GiftTypeIncrease } else { changeType = log.GiftTypeReduce @@ -81,7 +81,7 @@ func (l *UpdateUserBasicInfoLogic) UpdateUserBasicInfo(req *types.UpdateUserBasi giftLog := log.Gift{ Type: changeType, Amount: change, - Balance: req.GiftAmount, + Balance: *req.GiftAmount, Remark: "Admin adjustment", Timestamp: time.Now().UnixMilli(), } @@ -96,23 +96,27 @@ func (l *UpdateUserBasicInfoLogic) UpdateUserBasicInfo(req *types.UpdateUserBasi if err != nil { return err } - userInfo.GiftAmount = req.GiftAmount + userInfo.GiftAmount = *req.GiftAmount } } - if req.Commission != userInfo.Commission { - if isWithdrawalScene(req.Remark) { + if req.Commission != nil && *req.Commission != userInfo.Commission { + remark := "" + if req.Remark != nil { + remark = *req.Remark + } + if isWithdrawalScene(remark) { logWithdrawalGuard(l.Logger, userInfo.Id) return errors.Wrapf(xerr.NewErrCode(xerr.InvalidAccess), "commission overwrite is blocked in withdrawal scene") } - change := req.Commission - userInfo.Commission + change := *req.Commission - userInfo.Commission if err = l.svcCtx.UserModel.UpdateCommission(l.ctx, userInfo.Id, change, tx); err != nil { return err } if err = logicCommon.WriteCommissionLog(tx, userInfo.Id, log.CommissionTypeAdjust, change, ""); err != nil { return err } - userInfo.Commission = req.Commission + userInfo.Commission = *req.Commission } if req.Avatar != "" { userInfo.Avatar = req.Avatar @@ -120,8 +124,8 @@ func (l *UpdateUserBasicInfoLogic) UpdateUserBasicInfo(req *types.UpdateUserBasi if req.ReferCode != "" { userInfo.ReferCode = req.ReferCode } - if req.RefererId != 0 { - userInfo.RefererId = req.RefererId + if req.RefererId != nil { + userInfo.RefererId = *req.RefererId } if req.Enable != nil { userInfo.Enable = req.Enable @@ -129,8 +133,8 @@ func (l *UpdateUserBasicInfoLogic) UpdateUserBasicInfo(req *types.UpdateUserBasi if req.IsAdmin != nil { userInfo.IsAdmin = req.IsAdmin } - if req.Remark != "" { - userInfo.Remark = req.Remark + if req.Remark != nil { + userInfo.Remark = *req.Remark } if req.OnlyFirstPurchase != nil { userInfo.OnlyFirstPurchase = req.OnlyFirstPurchase diff --git a/internal/types/types.go b/internal/types/types.go index c1db528..d90b2ed 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -3264,20 +3264,20 @@ type UpdateUserAuthMethodRequest struct { } type UpdateUserBasiceInfoRequest struct { - UserId int64 `json:"user_id" validate:"required"` - Password string `json:"password"` - Avatar string `json:"avatar"` - Balance int64 `json:"balance"` - Commission int64 `json:"commission"` - ReferralPercentage uint8 `json:"referral_percentage"` - OnlyFirstPurchase *bool `json:"only_first_purchase"` - GiftAmount int64 `json:"gift_amount"` - Telegram int64 `json:"telegram"` - ReferCode string `json:"refer_code"` - RefererId int64 `json:"referer_id"` - Enable *bool `json:"enable"` - IsAdmin *bool `json:"is_admin"` - Remark string `json:"remark"` + UserId int64 `json:"user_id" validate:"required"` + Password string `json:"password"` + Avatar string `json:"avatar"` + Balance *int64 `json:"balance"` + Commission *int64 `json:"commission"` + ReferralPercentage uint8 `json:"referral_percentage"` + OnlyFirstPurchase *bool `json:"only_first_purchase"` + GiftAmount *int64 `json:"gift_amount"` + Telegram int64 `json:"telegram"` + ReferCode string `json:"refer_code"` + RefererId *int64 `json:"referer_id"` + Enable *bool `json:"enable"` + IsAdmin *bool `json:"is_admin"` + Remark *string `json:"remark"` } type UpdateUserNotifyRequest struct { diff --git a/internal/types/update_user_basic_info_request_test.go b/internal/types/update_user_basic_info_request_test.go new file mode 100644 index 0000000..4d0efc5 --- /dev/null +++ b/internal/types/update_user_basic_info_request_test.go @@ -0,0 +1,35 @@ +package types + +import ( + "encoding/json" + "testing" +) + +func TestUpdateUserBasicInfoRequestRemarkPresence(t *testing.T) { + var omitted UpdateUserBasiceInfoRequest + if err := json.Unmarshal([]byte(`{"user_id":1}`), &omitted); err != nil { + t.Fatalf("unmarshal omitted remark: %v", err) + } + if omitted.Remark != nil { + t.Fatalf("omitted remark = %q, want nil", *omitted.Remark) + } + + var cleared UpdateUserBasiceInfoRequest + if err := json.Unmarshal([]byte(`{"user_id":1,"remark":""}`), &cleared); err != nil { + t.Fatalf("unmarshal empty remark: %v", err) + } + if cleared.Remark == nil { + t.Fatal("empty remark was decoded as nil, want explicit empty string") + } + if *cleared.Remark != "" { + t.Fatalf("empty remark = %q, want empty string", *cleared.Remark) + } + + var updated UpdateUserBasiceInfoRequest + if err := json.Unmarshal([]byte(`{"user_id":1,"remark":"new note"}`), &updated); err != nil { + t.Fatalf("unmarshal non-empty remark: %v", err) + } + if updated.Remark == nil || *updated.Remark != "new note" { + t.Fatalf("non-empty remark = %#v, want %q", updated.Remark, "new note") + } +}