126 lines
2.7 KiB
Go
126 lines
2.7 KiB
Go
package db
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type User struct {
|
|
Id string
|
|
Name string
|
|
Reference string
|
|
}
|
|
|
|
type Gift struct {
|
|
Id string
|
|
Name string
|
|
}
|
|
|
|
func queryForUser(query string, args ...any) (*User, error) {
|
|
var id string
|
|
var name string
|
|
var reference string
|
|
err := database.QueryRow(query, args...).Scan(&id, &name, &reference)
|
|
if err == sql.ErrNoRows {
|
|
return nil, nil
|
|
} else if err != nil {
|
|
return nil, err
|
|
}
|
|
user := User{
|
|
Id: id,
|
|
Name: name,
|
|
Reference: reference,
|
|
}
|
|
return &user, nil
|
|
}
|
|
|
|
func GetUserByName(username string) (*User, error) {
|
|
stmt := "SELECT user.id, user.name, user.reference FROM user WHERE user.name = ?"
|
|
return queryForUser(stmt, username)
|
|
}
|
|
|
|
func GetUserByReference(reference string) (*User, error) {
|
|
stmt := "SELECT user.id, user.name, user.reference FROM user WHERE user.reference = ?"
|
|
return queryForUser(stmt, reference)
|
|
}
|
|
|
|
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
|
|
}
|