docs(scripts): 添加测试数据清理脚本的详细使用文档 fix(auth): 修复设备登录时处理孤立认证方法的问题 refactor(public): 改进邮箱绑定逻辑中的推荐码处理
This commit is contained in:
@@ -86,40 +86,63 @@ func (l *DeviceLoginLogic) DeviceLogin(req *types.DeviceLoginRequest) (resp *typ
|
||||
}
|
||||
|
||||
if authMethod != nil {
|
||||
// 认证方法存在但设备记录不存在,可能是数据不一致,获取用户信息并重新创建设备记录
|
||||
// 认证方法存在但设备记录不存在,可能是数据不一致,先检查用户是否存在
|
||||
userInfo, err = l.svcCtx.UserModel.FindOne(l.ctx, authMethod.UserId)
|
||||
if err != nil {
|
||||
l.Errorw("query user by auth method failed",
|
||||
logger.Field("user_id", authMethod.UserId),
|
||||
logger.Field("identifier", req.Identifier),
|
||||
logger.Field("error", err.Error()),
|
||||
)
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "query user failed: %v", err.Error())
|
||||
}
|
||||
|
||||
// 重新创建缺失的设备记录
|
||||
deviceInfo := &user.Device{
|
||||
Ip: req.IP,
|
||||
UserId: userInfo.Id,
|
||||
UserAgent: req.UserAgent,
|
||||
Identifier: req.Identifier,
|
||||
Enabled: true,
|
||||
Online: false,
|
||||
}
|
||||
if err := l.svcCtx.UserModel.InsertDevice(l.ctx, deviceInfo); err != nil {
|
||||
l.Errorw("failed to recreate device record",
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
// 用户不存在,说明是孤立的认证方法记录,需要清理
|
||||
l.Errorw("found orphaned auth method record, cleaning up",
|
||||
logger.Field("auth_method_id", authMethod.Id),
|
||||
logger.Field("user_id", authMethod.UserId),
|
||||
logger.Field("identifier", req.Identifier),
|
||||
)
|
||||
|
||||
// 删除孤立的认证方法记录
|
||||
if deleteErr := l.svcCtx.UserModel.DeleteUserAuthMethods(l.ctx, authMethod.UserId, authMethod.AuthType); deleteErr != nil {
|
||||
l.Errorw("failed to delete orphaned auth method",
|
||||
logger.Field("auth_method_id", authMethod.Id),
|
||||
logger.Field("error", deleteErr.Error()),
|
||||
)
|
||||
}
|
||||
|
||||
// 创建新用户和设备
|
||||
userInfo, err = l.registerUserAndDevice(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
l.Errorw("query user by auth method failed",
|
||||
logger.Field("user_id", authMethod.UserId),
|
||||
logger.Field("identifier", req.Identifier),
|
||||
logger.Field("error", err.Error()),
|
||||
)
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "query user failed: %v", err.Error())
|
||||
}
|
||||
} else {
|
||||
// 用户存在,重新创建缺失的设备记录
|
||||
deviceInfo := &user.Device{
|
||||
Ip: req.IP,
|
||||
UserId: userInfo.Id,
|
||||
UserAgent: req.UserAgent,
|
||||
Identifier: req.Identifier,
|
||||
Enabled: true,
|
||||
Online: false,
|
||||
}
|
||||
if err := l.svcCtx.UserModel.InsertDevice(l.ctx, deviceInfo); err != nil {
|
||||
l.Errorw("failed to recreate device record",
|
||||
logger.Field("user_id", userInfo.Id),
|
||||
logger.Field("identifier", req.Identifier),
|
||||
logger.Field("error", err.Error()),
|
||||
)
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "recreate device record failed: %v", err)
|
||||
}
|
||||
|
||||
l.Infow("found existing auth method without device record, recreated device record",
|
||||
logger.Field("user_id", userInfo.Id),
|
||||
logger.Field("identifier", req.Identifier),
|
||||
logger.Field("error", err.Error()),
|
||||
logger.Field("device_id", deviceInfo.Id),
|
||||
)
|
||||
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "recreate device record failed: %v", err)
|
||||
}
|
||||
|
||||
l.Infow("found existing auth method without device record, recreated device record",
|
||||
logger.Field("user_id", userInfo.Id),
|
||||
logger.Field("identifier", req.Identifier),
|
||||
logger.Field("device_id", deviceInfo.Id),
|
||||
)
|
||||
} else {
|
||||
// 设备和认证方法都不存在,创建新用户和设备
|
||||
userInfo, err = l.registerUserAndDevice(req)
|
||||
|
||||
Reference in New Issue
Block a user