91 lines
1.9 KiB
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
|
|
}
|
|
}
|