78 lines
1.8 KiB
Go
78 lines
1.8 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
// CreateUser creates a new user and inserts it into the database
|
|
func CreateUser(user User) (newUser User, err error) {
|
|
|
|
newUser = user
|
|
|
|
// Check if we have all needed informations
|
|
if newUser.Password == "" || newUser.Username == "" {
|
|
return User{}, fmt.Errorf("you need to specify at least a username and a password")
|
|
}
|
|
|
|
// Check if the user already existst
|
|
existingUser, exists, err := GetUser(User{Username: newUser.Username})
|
|
if err != nil {
|
|
return User{}, err
|
|
}
|
|
if exists {
|
|
return User{}, ErrUsernameExists{existingUser.ID, existingUser.Username}
|
|
}
|
|
|
|
// Hash the password
|
|
newUser.Password, err = hashPassword(user.Password)
|
|
if err != nil {
|
|
return User{}, err
|
|
}
|
|
|
|
// Insert it
|
|
_, err = x.Insert(newUser)
|
|
if err != nil {
|
|
return User{}, err
|
|
}
|
|
|
|
// Get the full new User
|
|
newUserOut, _, err := GetUser(newUser)
|
|
|
|
return newUserOut, nil
|
|
}
|
|
|
|
// HashPassword hashes a password
|
|
func hashPassword(password string) (string, error) {
|
|
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
|
|
return string(bytes), err
|
|
}
|
|
|
|
// UpdateUser updates a user
|
|
func UpdateUser(user User) (updatedUser User, err error) {
|
|
// Check if we have at least a username
|
|
if user.Username == "" {
|
|
return User{}, ErrNoUsername{user.ID}
|
|
}
|
|
|
|
// Check if it exists
|
|
theUser, exists, err := GetUserByID(user.ID)
|
|
if exists {
|
|
|
|
user.Password = theUser.Password // set the password to the one in the database to not accedently resetting it
|
|
|
|
// Update it
|
|
_, err = x.Id(user.ID).Update(user)
|
|
if err != nil {
|
|
return User{}, err
|
|
}
|
|
}
|
|
|
|
return User{}, fmt.Errorf("This user does not exist")
|
|
}
|
|
|
|
// UpdateUserPassword updates the password of a user
|
|
func UpdateUserPassword(userID int64, newPassword string) (err error) {
|
|
return nil
|
|
}
|