mirror of
https://git.rwth-aachen.de/acs/public/villas/web-backend-go/
synced 2025-03-30 00:00:12 +01:00

- testing more error return codes - remove some errors from code - remove unnecessary code - require a username of at least 3 letters/digits
72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
package user
|
|
|
|
import (
|
|
"fmt"
|
|
"git.rwth-aachen.de/acs/public/villas/villasweb-backend-go/database"
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
const bcryptCost = 10
|
|
|
|
// This is ugly but no other way to keep each model on the corresponding
|
|
// package since we have circular dependencies. Methods of a type must
|
|
// live in the same package.
|
|
type User struct {
|
|
database.User // check golang embedding types
|
|
}
|
|
|
|
func (u *User) save() error {
|
|
db := database.GetDB()
|
|
err := db.Create(u).Error
|
|
return err
|
|
}
|
|
|
|
func (u *User) remove() error {
|
|
db := database.GetDB()
|
|
err := db.Delete(u).Error
|
|
return err
|
|
}
|
|
|
|
func (u *User) ByUsername(username string) error {
|
|
db := database.GetDB()
|
|
err := db.Find(u, "Username = ?", username).Error
|
|
return err
|
|
}
|
|
|
|
func (u *User) ByID(id uint) error {
|
|
db := database.GetDB()
|
|
err := db.Find(u, id).Error
|
|
return err
|
|
}
|
|
|
|
func (u *User) setPassword(password string) error {
|
|
if len(password) == 0 {
|
|
return fmt.Errorf("Password cannot be empty")
|
|
}
|
|
newPassword, err :=
|
|
bcrypt.GenerateFromPassword([]byte(password), bcryptCost)
|
|
if err != nil {
|
|
return fmt.Errorf("Failed to generate hash from password")
|
|
}
|
|
u.Password = string(newPassword)
|
|
return nil
|
|
}
|
|
|
|
func (u *User) validatePassword(password string) error {
|
|
loginPassword := []byte(password)
|
|
hashedPassword := []byte(u.Password)
|
|
return bcrypt.CompareHashAndPassword(hashedPassword, loginPassword)
|
|
}
|
|
|
|
func (u *User) update(updatedUser User) error {
|
|
|
|
// TODO: if the field is empty string member shouldn't be updated
|
|
u.Username = updatedUser.Username
|
|
u.Password = updatedUser.Password
|
|
u.Mail = updatedUser.Mail
|
|
u.Role = updatedUser.Role
|
|
|
|
db := database.GetDB()
|
|
err := db.Model(u).Update(updatedUser).Error
|
|
return err
|
|
}
|