package logic import ( "context" "lone-services/pkg/modelbase" "lone-services/pkg/redis" "lone-services/pkg/utils" "lone-services/pkg/validate" user "lone-services/rpc/user/pb" "lone-services/services/user/internal/dao" "lone-services/services/user/internal/model" "lone-services/services/user/internal/svc" "lone-services/services/user/validator" "strconv" "github.com/zeromicro/go-zero/core/logx" ) type RegisterByUserLogic struct { ctx context.Context svcCtx *svc.ServiceContext logx.Logger } func NewRegisterByUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RegisterByUserLogic { return &RegisterByUserLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logx.WithContext(ctx), } } func (l *RegisterByUserLogic) RegisterByUser(in *user.RegisterByUserReq) (*user.Response, error) { var v validator.RegisterByUserValidator if msg := validate.ValidateFromProto(in, &v); msg != utils.StringEmpty { return outResponse(utils.ErrorParams, msg), nil } codePrefix := utils.StringEmpty if v.Type == utils.NumberTwo { codePrefix = "1:" } test := utils.GetConfigBool("sms.sms_test") isTest := test && v.Code == utils.GetConfigString("sms.sms_test_code") codeKey := utils.CodeKey + codePrefix + v.Account code, err := redis.Client.Get(l.ctx, codeKey).Result() if (err != nil || code != v.Code) && !isTest { return outResponse(utils.ErrorMissingParams, "验证码错误"), nil } var old dao.UserExist err = model.UserModel{}.Init().GetOne(modelbase.Params{ Eq: map[string]string{ "account": v.Account, "type": strconv.FormatUint(uint64(v.Type), utils.NumberTen), }, }, &old) if err != nil { l.Errorf("registerByUser check account: %v", err) return failResponse(utils.Fail), nil } if old.Id > utils.NumberZero { return failResponse(utils.ErrorDataIsExist), nil } add := dao.UserCreateByPwd{ Type: uint8(v.Type), Account: v.Account, Salt: utils.GetRandString(utils.NumberFive), AppId: v.AppId, Status: utils.NumberOne, IsRegistered: utils.NumberOne, IsFaceVerified: utils.NumberTwo, IsProfileCompleted: utils.NumberTwo, OnTrialNum: utils.NumberOne, } pwd := utils.GetSaltPassword(add.Salt, v.Pwd) add.Password, err = utils.EncryptPassword(pwd) if err != nil { l.Errorf("registerByUser encrypt password: %v", err) return failResponse(utils.Fail), nil } if v.Type == utils.NumberOne { encryptMobile, cErr := utils.EncryptPhone(v.Account) if cErr != nil { l.Errorf("registerByUser encrypt mobile: %v", cErr) return failResponse(utils.ErrorEncryptAesError), nil } add.Mobile = encryptMobile } err = model.UserModel{}.Init().CreateByPwd(&add) if err != nil || add.Id < utils.NumberOne { l.Errorf("registerByUser create: %v", err) return failResponse(utils.Fail), nil } redis.Client.Del(l.ctx, codeKey) return okResponse(map[string]any{"id": add.Id}), nil }