kuvia2/pkg/user/user.go
2022-01-15 00:09:03 +01:00

97 lines
No EOL
2.1 KiB
Go

package user
import (
"errors"
"github.com/jmoiron/sqlx"
"golang.org/x/crypto/bcrypt"
)
type User struct {
Id int
Username string
Password string
Name string
AboutMe string `db:"aboutme"`
Location string
Webpage string
Image string
}
func GetUserById(sqlx *sqlx.DB, id int) (User, error) {
users := []User{}
err := sqlx.Select(&users, "SELECT * FROM users WHERE id = ?", id)
if err != nil {
return User{}, nil
}
if len(users) == 0 {
return User{}, errors.New("User not found")
}
if len(users) > 1 {
return User{}, errors.New("User not unique")
}
return users[0], nil
}
func GetUserByUsername(sqlx *sqlx.DB, username string) (User, error) {
users := []User{}
err := sqlx.Select(&users, "SELECT * FROM users WHERE username = ?", username)
if err != nil {
return User{}, nil
}
if len(users) == 0 {
return User{}, errors.New("User not found")
}
if len(users) > 1 {
return User{}, errors.New("User not unique")
}
return users[0], nil
}
func CheckUsernameIsFree(sqlx *sqlx.DB, username string) (bool, error) {
rows, err := sqlx.NamedQuery(`SELECT count(1) AS 'count' FROM users WHERE username=:username`, map[string]interface{}{"username": username})
if err != nil {
return false, err
}
checkUserResult := make(map[string]interface{})
rows.Next()
err = rows.MapScan(checkUserResult)
if err != nil {
return false, err
}
if checkUserResult["count"].(int64) > 0 {
return false, nil
}
return true, nil
}
func Register(sqlx *sqlx.DB, username, password string) (int64, error) {
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.MinCost)
hashstring := string(hash)
res, err := sqlx.NamedExec(`INSERT INTO users (username,password) VALUES (:username,:password)`,
map[string]interface{}{
"username": username,
"password": hashstring,
})
if err != nil {
return 0, err
}
id, err := res.LastInsertId()
if err != nil {
return 0, err
}
return id, nil
}
func UpdateUser(sqlx *sqlx.DB, user User) (error) {
_, err := sqlx.NamedExec("UPDATE users SET name = :name, aboutme = :aboutme, location = :location, webpage = :webpage, image = :image WHERE id = :id", user)
return err
}