feat(用户): 实现邮箱绑定功能并返回登录凭证
Build docker and publish / build (20.15.1) (push) Successful in 7m41s

修改绑定邮箱接口返回登录凭证,优化用户数据迁移流程
添加用户缓存清理逻辑,确保设备绑定后数据一致性
完善邮箱验证和绑定逻辑的注释和错误处理
This commit is contained in:
2025-10-23 10:07:59 -07:00
parent 38655c0d38
commit fde3210a88
8 changed files with 217 additions and 72 deletions
+67
View File
@@ -187,6 +187,28 @@ func (l *BindDeviceLogic) createDeviceForUser(identifier, ip, userAgent string,
return err
}
// 清理用户缓存,确保新设备能正确显示在用户的设备列表中
userInfo, err := l.svcCtx.UserModel.FindOne(l.ctx, userId)
if err != nil {
l.Errorw("failed to find user for cache clearing",
logger.Field("user_id", userId),
logger.Field("error", err.Error()),
)
// 不因为缓存清理失败而返回错误,因为设备创建已经成功
} else {
if err := l.svcCtx.UserModel.ClearUserCache(l.ctx, userInfo); err != nil {
l.Errorw("failed to clear user cache",
logger.Field("user_id", userId),
logger.Field("error", err.Error()),
)
// 不因为缓存清理失败而返回错误,因为设备创建已经成功
} else {
l.Infow("cleared user cache after device creation",
logger.Field("user_id", userId),
)
}
}
// 记录设备创建成功的日志
l.Infow("device created successfully",
logger.Field("identifier", identifier),
@@ -321,6 +343,51 @@ func (l *BindDeviceLogic) rebindDeviceToNewUser(deviceInfo *user.Device, ip, use
return err
}
// 清理新用户的缓存,确保用户信息能正确更新
// 这是关键步骤:设备迁移后必须清理缓存,否则用户看到的还是旧的设备列表
newUser, err := l.svcCtx.UserModel.FindOne(l.ctx, newUserId)
if err != nil {
l.Errorw("failed to find new user for cache clearing",
logger.Field("new_user_id", newUserId),
logger.Field("error", err.Error()),
)
// 不因为缓存清理失败而返回错误,因为数据迁移已经成功
} else {
if err := l.svcCtx.UserModel.ClearUserCache(l.ctx, newUser); err != nil {
l.Errorw("failed to clear new user cache",
logger.Field("new_user_id", newUserId),
logger.Field("error", err.Error()),
)
// 不因为缓存清理失败而返回错误,因为数据迁移已经成功
} else {
l.Infow("cleared new user cache after device rebinding",
logger.Field("new_user_id", newUserId),
)
}
}
// 清理原用户的缓存(如果原用户没有被禁用的话)
oldUser, err := l.svcCtx.UserModel.FindOne(l.ctx, oldUserId)
if err != nil {
l.Errorw("failed to find old user for cache clearing",
logger.Field("old_user_id", oldUserId),
logger.Field("error", err.Error()),
)
// 不因为缓存清理失败而返回错误
} else {
if err := l.svcCtx.UserModel.ClearUserCache(l.ctx, oldUser); err != nil {
l.Errorw("failed to clear old user cache",
logger.Field("old_user_id", oldUserId),
logger.Field("error", err.Error()),
)
// 不因为缓存清理失败而返回错误
} else {
l.Infow("cleared old user cache after device rebinding",
logger.Field("old_user_id", oldUserId),
)
}
}
// 记录设备重新绑定成功的日志
l.Infow("device rebound successfully",
logger.Field("identifier", deviceInfo.Identifier),