s1llyw0rdz/storage/user.go

113 lines
2.9 KiB
Go
Raw Normal View History

2021-11-22 08:05:57 +00:00
package storage
import (
2021-12-10 17:48:24 +00:00
"errors"
2021-11-22 08:05:57 +00:00
"status/model"
)
2021-12-10 17:48:24 +00:00
const queryFindName = `SELECT name, hash, created_at, homepage, about, picture, email, active, signup_email FROM users WHERE name=lower($1);`
2021-11-22 08:05:57 +00:00
func (s *Storage) queryUser(q string, params ...interface{}) (user model.User, err error) {
2021-12-10 17:48:24 +00:00
err = s.db.QueryRow(q, params...).Scan(&user.Name, &user.Hash, &user.CreatedAt, &user.Homepage, &user.About, &user.Picture, &user.Email, &user.Active, &user.SignupEmail)
2021-11-22 08:05:57 +00:00
return
}
2021-11-22 09:26:30 +00:00
func (s *Storage) VerifyUser(user model.User) (model.User, error) {
u, err := s.queryUser(queryFindName, user.Name)
if err != nil {
return u, err
}
if err := user.CompareHashToPassword(u.Hash); err != nil {
2021-12-10 17:48:24 +00:00
return u, errors.New("incorrect password")
}
if !u.Active {
return u, errors.New("user not active")
2021-11-22 09:26:30 +00:00
}
return u, nil
}
2021-11-22 08:05:57 +00:00
func (s *Storage) UserExists(name string) bool {
var rv bool
s.db.QueryRow(`SELECT true FROM users WHERE name=lower($1)`, name).Scan(&rv)
return rv
}
func (s *Storage) UserByName(name string) (model.User, error) {
return s.queryUser(queryFindName, name)
}
func (s *Storage) CreateUser(user model.User) error {
hash, err := user.HashPassword()
if err != nil {
return err
}
2021-12-22 09:21:14 +00:00
insertUser := `INSERT INTO users (name, hash, email, signup_email, signup_msg, active) VALUES (lower($1), $2, $3, $4, $5, $6)`
2021-11-22 08:05:57 +00:00
statement, err := s.db.Prepare(insertUser)
if err != nil {
return err
}
2021-12-22 09:21:14 +00:00
_, err = statement.Exec(user.Name, hash, user.Email, user.SignupEmail, user.SignupMsg, user.Active)
2021-11-22 08:05:57 +00:00
return err
}
func (s *Storage) Users() ([]string, error) {
rows, err := s.db.Query("select name from users")
if err != nil {
return nil, err
}
var users []string
for rows.Next() {
var user string
err := rows.Scan(&user)
if err != nil {
return users, err
}
users = append(users, user)
}
return users, nil
}
2021-12-10 17:48:24 +00:00
func (s *Storage) InactiveUsers() ([]model.User, error) {
rows, err := s.db.Query("select name, signup_email, signup_msg from users where active is false")
if err != nil {
return nil, err
}
var users []model.User
for rows.Next() {
var user model.User
err := rows.Scan(&user.Name, &user.SignupEmail, &user.SignupMsg)
if err != nil {
return users, err
}
users = append(users, user)
}
return users, nil
}
func (s *Storage) ActivateUser(name string) error {
stmt, err := s.db.Prepare(`UPDATE users SET active = true WHERE name = $1;`)
2021-11-22 08:05:57 +00:00
if err != nil {
return err
}
2021-12-10 17:48:24 +00:00
_, err = stmt.Exec(name)
return err
}
func (s *Storage) DeleteUser(username string) error {
stmt, err := s.db.Prepare(`DELETE from users WHERE name = $1;`)
2021-11-22 08:05:57 +00:00
if err != nil {
return err
}
_, err = stmt.Exec(username)
return err
}
2021-11-25 06:37:30 +00:00
func (s *Storage) UpdateSettings(username, homepage, about, picture, email string) error {
stmt, err := s.db.Prepare(`UPDATE users SET homepage = $1, about = $2, picture = $3, email = $4 WHERE name = $5;`)
2021-11-25 06:37:30 +00:00
if err != nil {
return err
}
_, err = stmt.Exec(homepage, about, picture, email, username)
2021-11-25 06:37:30 +00:00
return err
}