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  }