فهرست منبع

Add function to the model for email address management (add/delete/activate)

Peter 10 سال پیش
والد
کامیت
6919c80f0b
1فایلهای تغییر یافته به همراه133 افزوده شده و 0 حذف شده
  1. 133 0
      models/user.go

+ 133 - 0
models/user.go

@@ -42,6 +42,8 @@ var (
 	ErrUserNotExist          = errors.New("User does not exist")
 	ErrUserNotKeyOwner       = errors.New("User does not the owner of public key")
 	ErrEmailAlreadyUsed      = errors.New("E-mail already used")
+	ErrEmailNotExist         = errors.New("E-mail does not exist")
+	ErrEmailNotActivated     = errors.New("E-mail address has not been activated")
 	ErrUserNameIllegal       = errors.New("User name contains illegal characters")
 	ErrLoginSourceNotExist   = errors.New("Login source does not exist")
 	ErrLoginSourceNotActived = errors.New("Login source is not actived")
@@ -101,6 +103,7 @@ type EmailAddress struct {
 	OwnerId     int64  `xorm:"INDEX NOT NULL"`
 	Email       string `xorm:"UNIQUE NOT NULL"`
 	IsActivated bool
+	IsPrimary   bool `xorm:"-"`
 }
 
 // DashboardLink returns the user dashboard page link.
@@ -368,6 +371,25 @@ func VerifyUserActiveCode(code string) (user *User) {
 	return nil
 }
 
+// verify active code when active account
+func VerifyActiveEmailCode(code, email string) *EmailAddress {
+	minutes := setting.Service.ActiveCodeLives
+
+	if user := getVerifyUser(code); user != nil {
+		// time limit code
+		prefix := code[:base.TimeLimitCodeLength]
+		data := com.ToStr(user.Id) + email + user.LowerName + user.Passwd + user.Rands
+
+		if base.VerifyTimeLimitCode(data, minutes, prefix) {
+			emailAddress := &EmailAddress{Email: email}
+			if has, _ := x.Get(emailAddress); has {
+				return emailAddress
+			}
+		}
+	}
+	return nil
+}
+
 // ChangeUserName changes all corresponding setting from old user name to new one.
 func ChangeUserName(u *User, newUserName string) (err error) {
 	if !IsLegalName(newUserName) {
@@ -604,6 +626,117 @@ func GetUserIdsByNames(names []string) []int64 {
 	return ids
 }
 
+// Get all email addresses
+func GetEmailAddresses(uid int64) ([]*EmailAddress, error) {
+	emails := make([]*EmailAddress, 0, 5)
+	err := x.Where("owner_id=?", uid).Find(&emails)
+	if err != nil {
+		return nil, err
+	}
+
+	u, err := GetUserById(uid)
+	if err != nil {
+		return nil, err
+	}
+
+	primary_email_found := false
+
+	for _, email := range emails {
+		if email.Email == u.Email {
+			primary_email_found = true
+			email.IsPrimary = true
+		} else {
+			email.IsPrimary = false
+		}
+	}
+
+	// We alway want the primary email address displayed, even if it's not in
+	// the emailaddress table (yet)
+	if !primary_email_found {
+		emails = append(emails, &EmailAddress{Email: u.Email, IsActivated: true, IsPrimary: true})
+	}
+	return emails, nil
+}
+
+func AddEmailAddress(email *EmailAddress) error {
+	used, err := IsEmailUsed(email.Email)
+	if err != nil {
+		return err
+	} else if used {
+		return ErrEmailAlreadyUsed
+	}
+
+	_, err = x.Insert(email)
+	return err
+}
+
+func (email *EmailAddress) Activate() error {
+	email.IsActivated = true
+	if _, err := x.Id(email.Id).AllCols().Update(email); err != nil {
+		return err
+	}
+
+	if user, err := GetUserById(email.OwnerId); err != nil {
+		return err
+	} else {
+		user.Rands = GetUserSalt()
+		return UpdateUser(user)
+	}
+}
+
+func DeleteEmailAddress(email *EmailAddress) error {
+	has, err := x.Get(email)
+	if err != nil {
+		return err
+	} else if !has {
+		return ErrEmailNotExist
+	}
+
+	if _, err = x.Delete(email); err != nil {
+		return err
+	}
+
+	return nil
+
+}
+
+func MakeEmailPrimary(email *EmailAddress) error {
+	has, err := x.Get(email)
+	if err != nil {
+		return err
+	} else if !has {
+		return ErrEmailNotExist
+	}
+
+	if !email.IsActivated {
+		return ErrEmailNotActivated
+	}
+
+	user := &User{Id: email.OwnerId}
+	has, err = x.Get(user)
+	if err != nil {
+		return err
+	} else if !has {
+		return ErrUserNotExist
+	}
+
+	// Make sure the former primary email doesn't disappear
+	former_primary_email := &EmailAddress{Email: user.Email}
+	has, err = x.Get(former_primary_email)
+	if err != nil {
+		return err
+	} else if !has {
+		former_primary_email.OwnerId = user.Id
+		former_primary_email.IsActivated = user.IsActive
+		x.Insert(former_primary_email)
+	}
+
+	user.Email = email.Email
+	_, err = x.Id(user.Id).AllCols().Update(user)
+
+	return err
+}
+
 // UserCommit represents a commit with validation of user.
 type UserCommit struct {
 	User *User