From a3cc23bbd4e3d647222c2f1df60b406278d41296 Mon Sep 17 00:00:00 2001 From: shanshanzhong Date: Thu, 12 Mar 2026 00:52:50 -0700 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=91=E5=AE=9A=E6=96=B0=E9=82=AE?= =?UTF-8?q?=E7=AE=B1=E6=97=B6=E5=88=9B=E5=BB=BA=E7=8B=AC=E7=AB=8B=E9=82=AE?= =?UTF-8?q?=E7=AE=B1=E7=94=A8=E6=88=B7=E5=B9=B6=E8=BD=AC=E7=A7=BB=E8=AE=A2?= =?UTF-8?q?=E9=98=85=EF=BC=8C=E8=80=8C=E9=9D=9E=E6=8C=82=E5=9C=A8=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=94=A8=E6=88=B7=E4=B8=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - bindEmailWithVerificationLogic: 新邮箱路径改为创建独立 email user + joinFamily - familyBindingHelper: clearMemberSubscribes → transferMemberSubscribesToOwner,订阅转移给 owner 而非删除 - accountMergeHelper: 同步更新调用点 Co-Authored-By: claude-flow --- .../logic/public/user/accountMergeHelper.go | 2 +- .../user/bindEmailWithVerificationLogic.go | 52 +++++++++++++++---- .../logic/public/user/familyBindingHelper.go | 10 ++-- 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/internal/logic/public/user/accountMergeHelper.go b/internal/logic/public/user/accountMergeHelper.go index 5a4e1fc..13a3fe3 100644 --- a/internal/logic/public/user/accountMergeHelper.go +++ b/internal/logic/public/user/accountMergeHelper.go @@ -74,7 +74,7 @@ func (h *accountMergeHelper) mergeIntoOwner(ownerUserID, deviceUserID int64, sou return err } - removedSubscribes, err := clearMemberSubscribes(tx, deviceUserID) + removedSubscribes, err := transferMemberSubscribesToOwner(tx, deviceUserID, ownerUserID) if err != nil { return err } diff --git a/internal/logic/public/user/bindEmailWithVerificationLogic.go b/internal/logic/public/user/bindEmailWithVerificationLogic.go index c6cef3d..e4ef91b 100644 --- a/internal/logic/public/user/bindEmailWithVerificationLogic.go +++ b/internal/logic/public/user/bindEmailWithVerificationLogic.go @@ -87,24 +87,54 @@ func (l *BindEmailWithVerificationLogic) BindEmailWithVerification(req *types.Bi return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "query email bind status failed") } - authInfo := &user.AuthMethods{ - UserId: u.Id, - AuthType: "email", - AuthIdentifier: req.Email, - Verified: true, + // Create a new email user and establish family relationship + var emailUser *user.User + if txErr := l.svcCtx.DB.Transaction(func(tx *gorm.DB) error { + emailUser = &user.User{ + Salt: "default", + OnlyFirstPurchase: &l.svcCtx.Config.Invite.OnlyFirstPurchase, + } + if err := tx.Create(emailUser).Error; err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "create email user failed: %v", err) + } + emailUser.ReferCode = uuidx.UserInviteCode(emailUser.Id) + if err := tx.Model(&user.User{}).Where("id = ?", emailUser.Id).Update("refer_code", emailUser.ReferCode).Error; err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseUpdateError), "update refer code failed: %v", err) + } + authInfo := &user.AuthMethods{ + UserId: emailUser.Id, + AuthType: "email", + AuthIdentifier: req.Email, + Verified: true, + } + if err := tx.Create(authInfo).Error; err != nil { + return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "create email auth method failed: %v", err) + } + return nil + }); txErr != nil { + return nil, txErr } - if err = l.svcCtx.UserModel.InsertUserAuthMethods(l.ctx, authInfo); err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "bind email failed: %v", err) + + // Join family: email user as owner, device user as member + if err = familyHelper.validateJoinFamily(emailUser.Id, u.Id); err != nil { + return nil, err + } + joinResult, err := familyHelper.joinFamily(emailUser.Id, u.Id, "bind_email_with_verification") + if err != nil { + return nil, err } token, err := l.refreshBindSessionToken(u.Id) if err != nil { return nil, err } return &types.BindEmailWithVerificationResponse{ - Success: true, - Message: "email bound successfully", - Token: token, - UserId: u.Id, + Success: true, + Message: "email user created and joined family", + Token: token, + UserId: u.Id, + FamilyJoined: true, + FamilyId: joinResult.FamilyId, + OwnerUserId: joinResult.OwnerUserId, }, nil } diff --git a/internal/logic/public/user/familyBindingHelper.go b/internal/logic/public/user/familyBindingHelper.go index c8a8ed5..b11a062 100644 --- a/internal/logic/public/user/familyBindingHelper.go +++ b/internal/logic/public/user/familyBindingHelper.go @@ -182,7 +182,7 @@ func (h *familyBindingHelper) joinFamily(ownerUserId, memberUserId int64, source } } - removedSubscribes, err = clearMemberSubscribes(tx, memberUserId) + removedSubscribes, err = transferMemberSubscribesToOwner(tx, memberUserId, ownerUserId) if err != nil { return err } @@ -199,7 +199,7 @@ func (h *familyBindingHelper) joinFamily(ownerUserId, memberUserId int64, source return result, nil } -func clearMemberSubscribes(tx *gorm.DB, memberUserId int64) ([]user.Subscribe, error) { +func transferMemberSubscribesToOwner(tx *gorm.DB, memberUserId, ownerUserId int64) ([]user.Subscribe, error) { var subscribes []user.Subscribe if err := tx.Model(&user.Subscribe{}). Where("user_id = ?", memberUserId). @@ -209,8 +209,10 @@ func clearMemberSubscribes(tx *gorm.DB, memberUserId int64) ([]user.Subscribe, e if len(subscribes) == 0 { return nil, nil } - if err := tx.Where("user_id = ?", memberUserId).Delete(&user.Subscribe{}).Error; err != nil { - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseUpdateError), "delete member subscribe list failed") + if err := tx.Model(&user.Subscribe{}). + Where("user_id = ?", memberUserId). + Update("user_id", ownerUserId).Error; err != nil { + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseUpdateError), "transfer member subscribes to owner failed") } return subscribes, nil }