package app import ( "errors" "strings" "git.echol.cn/loser/Go-Web-Template/server/global" appModel "git.echol.cn/loser/Go-Web-Template/server/model/app" appReq "git.echol.cn/loser/Go-Web-Template/server/model/app/request" "git.echol.cn/loser/Go-Web-Template/server/utils" "github.com/google/uuid" "gorm.io/gorm" ) type AppRegisterService struct{} var AppRegisterServiceApp = new(AppRegisterService) func (s *AppRegisterService) Register(req appReq.PublicRegister, mode RegisterMode) error { username := strings.TrimSpace(req.Username) password := req.Password welcome := strings.TrimSpace(req.WelcomePhrase) if username == "" || password == "" || welcome == "" { return errors.New("参数不完整") } if len(welcome) > 255 { return errors.New("欢迎词过长") } if mode == RegisterModeInvite && strings.TrimSpace(req.InviteCode) == "" { return errors.New("邀请码不能为空") } return global.GVA_DB.Transaction(func(tx *gorm.DB) error { var existed appModel.AppUser if err := tx.Where("username = ?", username).First(&existed).Error; err == nil { return errors.New("用户名已注册") } else if !errors.Is(err, gorm.ErrRecordNotFound) { return err } user := appModel.AppUser{ UUID: uuid.New(), Username: username, Password: utils.BcryptHash(password), Enable: 1, } if err := tx.Create(&user).Error; err != nil { return err } profile := appModel.AppUserProfile{ AppUserID: user.ID, WelcomePhrase: welcome, NickName: username, } if err := tx.Create(&profile).Error; err != nil { return err } if mode == RegisterModeInvite { if _, err := AppInviteCodeServiceApp.ConsumeByPlainCode(tx, req.InviteCode, user.ID); err != nil { return err } } return nil }) }