97 lines
2.1 KiB
Go
97 lines
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
|
||
|
}
|