diff --git a/internal/logic/public/user/bindEmailWithVerificationLogic.go b/internal/logic/public/user/bindEmailWithVerificationLogic.go index 6785623..a303a10 100644 --- a/internal/logic/public/user/bindEmailWithVerificationLogic.go +++ b/internal/logic/public/user/bindEmailWithVerificationLogic.go @@ -51,21 +51,27 @@ func (l *BindEmailWithVerificationLogic) BindEmailWithVerification(req *types.Bi // 检查邮箱是否已被其他用户绑定 existingMethod, err := l.svcCtx.UserModel.FindUserAuthMethodByOpenID(l.ctx, "email", req.Email) - if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { - l.Errorw("查询邮箱绑定状态失败", logger.Field("error", err.Error())) - return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "查询邮箱绑定状态失败") - } - var emailUserId int64 - if existingMethod != nil { + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + // 邮箱不存在,创建新的邮箱用户 + l.Infow("邮箱未绑定,将创建新的邮箱用户", logger.Field("email", req.Email)) + emailUserId, err = l.createEmailUser(req.Email) + } else { + // 数据库查询错误 + l.Errorw("查询邮箱绑定状态失败", logger.Field("error", err.Error())) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "查询邮箱绑定状态失败") + } + } else if existingMethod.Id != 0 { // 邮箱已存在,使用现有的邮箱用户 emailUserId = existingMethod.UserId l.Infow("邮箱已存在,将设备转移到现有邮箱用户", logger.Field("email", req.Email), logger.Field("email_user_id", emailUserId)) } else { - // 邮箱不存在,创建新的邮箱用户 + // 这种情况理论上不应该发生(查询成功但返回零值结构体) + l.Infow("查询到邮箱记录但ID为0,将创建新的邮箱用户", logger.Field("email", req.Email)) emailUserId, err = l.createEmailUser(req.Email) if err != nil { l.Errorw("创建邮箱用户失败", logger.Field("error", err.Error())) diff --git a/internal/model/user/device.go b/internal/model/user/device.go index b1194a7..14168ce 100644 --- a/internal/model/user/device.go +++ b/internal/model/user/device.go @@ -23,9 +23,8 @@ func (m *customUserModel) FindOneDevice(ctx context.Context, id int64) (*Device, } func (m *customUserModel) FindOneDeviceByIdentifier(ctx context.Context, id string) (*Device, error) { - deviceIdKey := fmt.Sprintf("%s%v", cacheUserDeviceNumberPrefix, id) var resp Device - err := m.QueryCtx(ctx, &resp, deviceIdKey, func(conn *gorm.DB, v interface{}) error { + err := m.QueryNoCacheCtx(ctx, &resp, func(conn *gorm.DB, v interface{}) error { return conn.Model(&Device{}).Where("`identifier` = ?", id).First(&resp).Error }) switch {