ohsnap/user.go

91 lines
1.9 KiB
Go

package main
import (
"crypto/rand"
"crypto/sha512"
)
type User struct {
Id int `json:"id"`
Name string `json:"name"`
apiKey []byte
}
func GetUser(name string) (User, error) {
var u User
if err := DBQueryRow("SELECT id, name FROM users WHERE name=?", name).Scan(&u.Id, &u.Name); err != nil {
return u, err
}
return u, nil
}
func GetUsers() ([]User, error) {
if rows, err := DBQuery("SELECT id, name FROM users"); err != nil {
return nil, err
} else {
defer rows.Close()
var users = make([]User, 0)
for rows.Next() {
var u User
if err := rows.Scan(&u.Id, &u.Name); err != nil {
return nil, err
}
users = append(users, u)
}
if err := rows.Err(); err != nil {
return nil, err
}
return users, nil
}
}
func GetUserById(id int64) (User, error) {
var u User
if err := DBQueryRow("SELECT id, name FROM users WHERE id=?", id).Scan(&u.Id, &u.Name); err != nil {
return u, err
}
return u, nil
}
func Authenticate(name string, key []byte) *User {
sum := sha512.Sum512(key)
var u User
if err := DBQueryRow("SELECT id, name FROM users WHERE name=? AND apikey IS NOT NULL AND apikey=?", name, sum[:]).Scan(&u.Id, &u.Name); err != nil {
return nil
}
return &u
}
func AddUser(name string) (int64, error) {
if res, err := DBExec("INSERT INTO users (name) VALUES (?)", name); err != nil {
return 0, err
} else if lid, err := res.LastInsertId(); err != nil {
return 0, err
} else {
return lid, err
}
}
func GenApiKey(name string) ([]byte, error) {
rnd := make([]byte, 64)
rand.Read(rnd)
sum := sha512.Sum512(rnd)
if _, err := DBExec("UPDATE users SET apikey=? WHERE name=?", sum[:], name); err != nil {
return nil, err
} else {
return rnd, nil
}
}
func RemoveUser(name string) (int64, error) {
if res, err := DBExec("DELETE FROM users WHERE name=?", name); err != nil {
return 0, err
} else if nb, err := res.RowsAffected(); err != nil {
return 0, err
} else {
return nb, err
}
}