package user import ( "context" "fmt" "time" "github.com/perfect-panel/server/internal/model/user" "github.com/perfect-panel/server/internal/svc" "github.com/perfect-panel/server/internal/types" "github.com/perfect-panel/server/pkg/logger" "github.com/perfect-panel/server/pkg/tool" "github.com/perfect-panel/server/pkg/uuidx" "github.com/perfect-panel/server/pkg/xerr" "github.com/pkg/errors" "gorm.io/gorm" ) type CreateUserLogic struct { ctx context.Context svcCtx *svc.ServiceContext logger.Logger } func NewCreateUserLogic(ctx context.Context, svcCtx *svc.ServiceContext) *CreateUserLogic { return &CreateUserLogic{ ctx: ctx, svcCtx: svcCtx, Logger: logger.WithContext(ctx), } } func (l *CreateUserLogic) CreateUser(req *types.CreateUserRequest) error { if req.ReferCode == "" { // timestamp replaces user id req.ReferCode = uuidx.UserInviteCode(time.Now().UnixMicro()) } if req.Password == "" { req.Password = req.Email } pwd := tool.EncodePassWord(req.Password) newUser := &user.User{ Password: pwd, ReferralPercentage: req.ReferralPercentage, OnlyFirstPurchase: &req.OnlyFirstPurchase, ReferCode: req.ReferCode, Balance: req.Balance, IsAdmin: &req.IsAdmin, } var ams []user.AuthMethods if req.TelephoneAreaCode != "" && req.Telephone != "" { phone := fmt.Sprintf("%s-%s", req.TelephoneAreaCode, req.Telephone) _, err := l.svcCtx.UserModel.FindUserAuthMethodByOpenID(l.ctx, "mobile", phone) if err == nil { return errors.Wrapf(xerr.NewErrCode(xerr.TelephoneExist), "telephone exist") } ams = append(ams, user.AuthMethods{ AuthType: "mobile", AuthIdentifier: phone, }) } if req.Email != "" { _, err := l.svcCtx.UserModel.FindUserAuthMethodByOpenID(l.ctx, "email", req.Email) if err == nil { return errors.Wrapf(xerr.NewErrCode(xerr.EmailExist), "email exist") } ams = append(ams, user.AuthMethods{ AuthType: "email", AuthIdentifier: req.Email, }) } newUser.AuthMethods = ams // todo: get product id and duration if req.RefererUser != "" { // get referer user id u, err := l.svcCtx.UserModel.FindOneByEmail(l.ctx, req.RefererUser) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return errors.Wrapf(xerr.NewErrCode(xerr.UserNotExist), "referer user not found: %v", err.Error()) } return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "find referer user failed: %v", err.Error()) } newUser.RefererId = u.Id } err := l.svcCtx.UserModel.Insert(l.ctx, newUser) if err != nil { return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseInsertError), "insert user failed: %v", err.Error()) } return nil }