feat: 绑定新邮箱时创建独立邮箱用户并转移订阅,而非挂在设备用户上
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 8m5s
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 8m5s
- bindEmailWithVerificationLogic: 新邮箱路径改为创建独立 email user + joinFamily - familyBindingHelper: clearMemberSubscribes → transferMemberSubscribesToOwner,订阅转移给 owner 而非删除 - accountMergeHelper: 同步更新调用点 Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
parent
ec39579c39
commit
a3cc23bbd4
@ -74,7 +74,7 @@ func (h *accountMergeHelper) mergeIntoOwner(ownerUserID, deviceUserID int64, sou
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
removedSubscribes, err := clearMemberSubscribes(tx, deviceUserID)
|
removedSubscribes, err := transferMemberSubscribesToOwner(tx, deviceUserID, ownerUserID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@ -87,24 +87,54 @@ func (l *BindEmailWithVerificationLogic) BindEmailWithVerification(req *types.Bi
|
|||||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "query email bind status failed")
|
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "query email bind status failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
authInfo := &user.AuthMethods{
|
// Create a new email user and establish family relationship
|
||||||
UserId: u.Id,
|
var emailUser *user.User
|
||||||
AuthType: "email",
|
if txErr := l.svcCtx.DB.Transaction(func(tx *gorm.DB) error {
|
||||||
AuthIdentifier: req.Email,
|
emailUser = &user.User{
|
||||||
Verified: true,
|
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)
|
token, err := l.refreshBindSessionToken(u.Id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return &types.BindEmailWithVerificationResponse{
|
return &types.BindEmailWithVerificationResponse{
|
||||||
Success: true,
|
Success: true,
|
||||||
Message: "email bound successfully",
|
Message: "email user created and joined family",
|
||||||
Token: token,
|
Token: token,
|
||||||
UserId: u.Id,
|
UserId: u.Id,
|
||||||
|
FamilyJoined: true,
|
||||||
|
FamilyId: joinResult.FamilyId,
|
||||||
|
OwnerUserId: joinResult.OwnerUserId,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -199,7 +199,7 @@ func (h *familyBindingHelper) joinFamily(ownerUserId, memberUserId int64, source
|
|||||||
return result, nil
|
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
|
var subscribes []user.Subscribe
|
||||||
if err := tx.Model(&user.Subscribe{}).
|
if err := tx.Model(&user.Subscribe{}).
|
||||||
Where("user_id = ?", memberUserId).
|
Where("user_id = ?", memberUserId).
|
||||||
@ -209,8 +209,10 @@ func clearMemberSubscribes(tx *gorm.DB, memberUserId int64) ([]user.Subscribe, e
|
|||||||
if len(subscribes) == 0 {
|
if len(subscribes) == 0 {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
if err := tx.Where("user_id = ?", memberUserId).Delete(&user.Subscribe{}).Error; err != nil {
|
if err := tx.Model(&user.Subscribe{}).
|
||||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseUpdateError), "delete member subscribe list failed")
|
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
|
return subscribes, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user