github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/service/user/register.go (about) 1 package user 2 3 import ( 4 "net/url" 5 "strings" 6 7 model "github.com/cloudreve/Cloudreve/v3/models" 8 "github.com/cloudreve/Cloudreve/v3/pkg/auth" 9 "github.com/cloudreve/Cloudreve/v3/pkg/email" 10 "github.com/cloudreve/Cloudreve/v3/pkg/hashid" 11 "github.com/cloudreve/Cloudreve/v3/pkg/serializer" 12 "github.com/gin-gonic/gin" 13 ) 14 15 // UserRegisterService 管理用户注册的服务 16 type UserRegisterService struct { 17 //TODO 细致调整验证规则 18 UserName string `form:"userName" json:"userName" binding:"required,email"` 19 Password string `form:"Password" json:"Password" binding:"required,min=4,max=64"` 20 } 21 22 // Register 新用户注册 23 func (service *UserRegisterService) Register(c *gin.Context) serializer.Response { 24 // 相关设定 25 options := model.GetSettingByNames("email_active") 26 27 // 相关设定 28 isEmailRequired := model.IsTrueVal(options["email_active"]) 29 defaultGroup := model.GetIntSetting("default_group", 2) 30 31 // 创建新的用户对象 32 user := model.NewUser() 33 user.Email = service.UserName 34 user.Nick = strings.Split(service.UserName, "@")[0] 35 user.SetPassword(service.Password) 36 user.Status = model.Active 37 if isEmailRequired { 38 user.Status = model.NotActivicated 39 } 40 user.GroupID = uint(defaultGroup) 41 userNotActivated := false 42 // 创建用户 43 if err := model.DB.Create(&user).Error; err != nil { 44 //检查已存在使用者是否尚未激活 45 expectedUser, err := model.GetUserByEmail(service.UserName) 46 if expectedUser.Status == model.NotActivicated { 47 userNotActivated = true 48 user = expectedUser 49 } else { 50 return serializer.Err(serializer.CodeEmailExisted, "Email already in use", err) 51 } 52 } 53 54 // 发送激活邮件 55 if isEmailRequired { 56 57 // 签名激活请求API 58 base := model.GetSiteURL() 59 userID := hashid.HashID(user.ID, hashid.UserID) 60 controller, _ := url.Parse("/api/v3/user/activate/" + userID) 61 activateURL, err := auth.SignURI(auth.General, base.ResolveReference(controller).String(), 86400) 62 if err != nil { 63 return serializer.Err(serializer.CodeEncryptError, "Failed to sign the activation link", err) 64 } 65 66 // 取得签名 67 credential := activateURL.Query().Get("sign") 68 69 // 生成对用户访问的激活地址 70 controller, _ = url.Parse("/activate") 71 finalURL := base.ResolveReference(controller) 72 queries := finalURL.Query() 73 queries.Add("id", userID) 74 queries.Add("sign", credential) 75 finalURL.RawQuery = queries.Encode() 76 77 // 返送激活邮件 78 title, body := email.NewActivationEmail(user.Email, 79 finalURL.String(), 80 ) 81 if err := email.Send(user.Email, title, body); err != nil { 82 return serializer.Err(serializer.CodeFailedSendEmail, "Failed to send activation email", err) 83 } 84 if userNotActivated == true { 85 //原本在上面要抛出的DBErr,放来这边抛出 86 return serializer.Err(serializer.CodeEmailSent, "User is not activated, activation email has been resent", nil) 87 } else { 88 return serializer.Response{Code: 203} 89 } 90 } 91 92 return serializer.Response{} 93 } 94 95 // Activate 激活用户 96 func (service *SettingService) Activate(c *gin.Context) serializer.Response { 97 // 查找待激活用户 98 uid, _ := c.Get("object_id") 99 user, err := model.GetUserByID(uid.(uint)) 100 if err != nil { 101 return serializer.Err(serializer.CodeUserNotFound, "User not fount", err) 102 } 103 104 // 检查状态 105 if user.Status != model.NotActivicated { 106 return serializer.Err(serializer.CodeUserCannotActivate, "This user cannot be activated", nil) 107 } 108 109 // 激活用户 110 user.SetStatus(model.Active) 111 112 return serializer.Response{Data: user.Email} 113 }