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 }