fix(用户逻辑): 修复设备记录中丢失IP和UserAgent的问题
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m5s

在删除账户和绑定邮箱逻辑中,保留原设备的IP和UserAgent信息
This commit is contained in:
shanshanzhong 2025-11-30 21:46:13 -08:00
parent 330b4ee6a1
commit 8086785828
2 changed files with 18 additions and 8 deletions

View File

@ -158,7 +158,15 @@ func (l *BindEmailWithVerificationLogic) BindEmailWithVerification(req *types.Bi
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseDeletedError), "删除用户记录失败")
}
err = l.createDeviceRecordForEmailUser(emailUserId, deviceIdentifier, "")
// 获取原设备信息以保留IP和UserAgent
oldDevice, err := l.svcCtx.UserModel.FindOneDeviceByIdentifier(l.ctx, deviceIdentifier)
var deviceIP, deviceUA string
if err == nil && oldDevice != nil {
deviceIP = oldDevice.Ip
deviceUA = oldDevice.UserAgent
}
err = l.createDeviceRecordForEmailUser(emailUserId, deviceIdentifier, deviceIP, deviceUA)
if err != nil {
l.Errorw("创建邮箱用户设备记录失败", logger.Field("error", err.Error()), logger.Field("email_user_id", emailUserId))
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "创建邮箱用户设备记录失败")
@ -212,14 +220,16 @@ func (l *BindEmailWithVerificationLogic) checkIfPureDeviceUser(ctx context.Conte
}
// 邮箱存在的情况:在 user_devices 中创建一条设备记录
func (l *BindEmailWithVerificationLogic) createDeviceRecordForEmailUser(emailUserId int64, deviceIdentifier string, userAgent string) error {
func (l *BindEmailWithVerificationLogic) createDeviceRecordForEmailUser(emailUserId int64, deviceIdentifier, ip, userAgent string) error {
// online 默认 0 enabled 默认 1
l.Infow("创建邮箱用户设备记录",
logger.Field("email_user_id", emailUserId),
logger.Field("device_identifier", deviceIdentifier),
logger.Field("online", true),
logger.Field("enabled", false),
logger.Field("user_agent", userAgent))
logger.Field("user_agent", userAgent),
logger.Field("ip", ip),
)
err := l.svcCtx.UserModel.InsertDevice(l.ctx, &user.Device{
UserId: emailUserId,
@ -227,6 +237,7 @@ func (l *BindEmailWithVerificationLogic) createDeviceRecordForEmailUser(emailUse
Online: false,
Enabled: false,
UserAgent: userAgent,
Ip: ip,
})
if err != nil {
l.Errorw("创建邮箱用户设备记录失败", logger.Field("error", err.Error()), logger.Field("email_user_id", emailUserId))

View File

@ -80,7 +80,7 @@ func (l *DeleteAccountLogic) DeleteAccount() (resp *types.DeleteAccountResponse,
// 7. 为每个原设备创建新的用户(使用同一事务)
for _, oldDevice := range devices {
userInfo, err := l.registerUserAndDevice(tx, oldDevice.Identifier)
userInfo, err := l.registerUserAndDevice(tx, oldDevice.Identifier, oldDevice.Ip, oldDevice.UserAgent)
if err != nil {
return errors.Wrap(err, "创建新用户失败")
}
@ -98,7 +98,6 @@ func (l *DeleteAccountLogic) DeleteAccount() (resp *types.DeleteAccountResponse,
resp.Message = "账户注销成功"
resp.UserId = newUserId
resp.Code = 200
return resp, nil
}
@ -109,7 +108,7 @@ func generateReferCode() string {
return hex.EncodeToString(bytes)
}
func (l *DeleteAccountLogic) registerUserAndDevice(tx *gorm.DB, identifier string) (*user.User, error) {
func (l *DeleteAccountLogic) registerUserAndDevice(tx *gorm.DB, identifier, ip, userAgent string) (*user.User, error) {
// 1. 创建新用户
userInfo := &user.User{
Salt: "default",
@ -141,9 +140,9 @@ func (l *DeleteAccountLogic) registerUserAndDevice(tx *gorm.DB, identifier strin
// 4. 插入设备记录
deviceInfo := &user.Device{
Ip: "",
Ip: ip,
UserId: userInfo.Id,
UserAgent: "",
UserAgent: userAgent,
Identifier: identifier,
Enabled: true,
Online: false,