lishwist/db/user.go

114 lines
2.3 KiB
Go

package db
import (
"database/sql"
"fmt"
"github.com/google/uuid"
)
type User struct {
Id string
Name string
}
type Gift struct {
Id string
Name string
}
func GetUser(username string) (*User, error) {
stmt := "SELECT user.id, user.name FROM user WHERE user.name = ?"
var id string
var name string
err := database.QueryRow(stmt, username).Scan(&id, &name)
if err == sql.ErrNoRows {
return nil, nil
} else if err != nil {
return nil, err
}
user := User{
Id: id,
Name: name,
}
return &user, nil
}
func CreateUser(username string, passHash []byte) (*User, error) {
stmt := "INSERT INTO user (name, motto, reference, password_hash) VALUES (?, '', ?, ?)"
reference, err := uuid.NewRandom()
if err != nil {
return nil, err
}
result, err := database.Exec(stmt, username, reference, passHash)
if err != nil {
return nil, err
}
id, err := result.LastInsertId()
if err != nil {
return nil, err
}
user := User{
Id: fmt.Sprintf("%d", id),
Name: username,
}
return &user, nil
}
func (u *User) GetPassHash() ([]byte, error) {
stmt := "SELECT user.password_hash FROM user WHERE user.id = ?"
var passHash string
err := database.QueryRow(stmt, u.Id).Scan(&passHash)
if err != nil {
return nil, err
}
return []byte(passHash), nil
}
func (u *User) GetGifts() ([]Gift, error) {
stmt := "SELECT gift.id, gift.name FROM gift JOIN user ON gift.recipient_id = user.id WHERE user.id = ?"
rows, err := database.Query(stmt, u.Id)
if err != nil {
return nil, err
}
defer rows.Close()
gifts := []Gift{}
for rows.Next() {
var id string
var name string
rows.Scan(&id, &name)
gift := Gift{
Id: id,
Name: name,
}
gifts = append(gifts, gift)
}
err = rows.Err()
if err != nil {
return nil, err
}
return gifts, nil
}
func (u *User) AddGift(name string) error {
stmt := "INSERT INTO gift (name, recipient_id, creator_id) VALUES (?, ?, ?)"
_, err := database.Exec(stmt, name, u.Id, u.Id)
if err != nil {
return err
}
return nil
}
func (u *User) RemoveGift(id string) error {
stmt := "DELETE FROM gift WHERE gift.creator_id = ? AND gift.id = ?"
result, err := database.Exec(stmt, u.Id, id)
if err != nil {
return err
}
affected, _ := result.RowsAffected()
if affected == 0 {
return fmt.Errorf("No gift match.")
}
return nil
}