105 lines
2.4 KiB
Go
105 lines
2.4 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
// UserLogin Object to recive user credentials in JSON format
|
|
type UserLogin struct {
|
|
Username string `json:"username" form:"username"`
|
|
Password string `json:"password" form:"password"`
|
|
}
|
|
|
|
// User holds information about an user
|
|
type User struct {
|
|
ID int64 `xorm:"int(11) autoincr not null unique pk"`
|
|
Name string `xorm:"varchar(250)"`
|
|
Username string `xorm:"varchar(250) not null unique"`
|
|
Password string `xorm:"varchar(250) not null"`
|
|
Email string `xorm:"varchar(250)"`
|
|
Created int64 `xorm:"created"`
|
|
Updated int64 `xorm:"updated"`
|
|
}
|
|
|
|
// TableName returns the table name for users
|
|
func (User) TableName() string {
|
|
return "users"
|
|
}
|
|
|
|
// GetUserByID gets informations about a user by its ID
|
|
func GetUserByID(id int64) (user User, exists bool, err error) {
|
|
return GetUser(User{ID: id})
|
|
}
|
|
|
|
// GetUser gets a user object
|
|
func GetUser(user User) (userOut User, exists bool, err error) {
|
|
userOut = user
|
|
exists, err = x.Get(&userOut)
|
|
return userOut, exists, err
|
|
}
|
|
|
|
// 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
|
|
_, exists, err := GetUser(User{Name: newUser.Name})
|
|
if err != nil {
|
|
return User{}, err
|
|
}
|
|
if exists {
|
|
return User{}, fmt.Errorf("this username is already taken. Please use another")
|
|
}
|
|
|
|
// 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
|
|
}
|
|
|
|
return newUser, nil
|
|
}
|
|
|
|
// HashPassword hashes a password
|
|
func hashPassword(password string) (string, error) {
|
|
bytes, err := bcrypt.GenerateFromPassword([]byte(password), 14)
|
|
return string(bytes), err
|
|
}
|
|
|
|
// CheckUserCredentials checks user credentials
|
|
func CheckUserCredentials(u *UserLogin) (User, error) {
|
|
|
|
// Check if the user exists
|
|
var user = User{Username: u.Username}
|
|
exists, err := x.Get(&user)
|
|
if err != nil {
|
|
return User{}, err
|
|
}
|
|
|
|
if !exists {
|
|
return User{}, fmt.Errorf("user does not exist")
|
|
}
|
|
|
|
// Check the users password
|
|
err = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(u.Password))
|
|
|
|
if err != nil {
|
|
return User{}, err
|
|
}
|
|
|
|
return user, nil
|
|
}
|