-
Notifications
You must be signed in to change notification settings - Fork 0
/
user.go
77 lines (67 loc) · 1.69 KB
/
user.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package bank
import (
// sqlite3 "github.com/mattn/go-sqlite3"
"database/sql"
"net/http"
"github.com/ewxrjk/bank/pkg/bcommon"
)
// User defines a single user.
type User struct {
// Name of the user
User string
// Hashed password
Password string
}
// ErrNoSuchUser is returned when accessing a user who does not exist.
var ErrNoSuchUser = bcommon.HTTPError{"user does not exist", http.StatusNotFound}
// GetUsers returns the list of user names.
func GetUsers(tx *sql.Tx) (users []string, err error) {
var rows *sql.Rows
if rows, err = tx.Query("SELECT user FROM users ORDER BY user"); err != nil {
return
}
defer rows.Close()
users = []string{}
for rows.Next() {
var user string
if err = rows.Scan(&user); err != nil {
return
}
users = append(users, user)
}
return
}
// Get fills in the data for a user.
func (u *User) Get(tx *sql.Tx, user string) (err error) {
err = tx.QueryRow("SELECT user, password FROM users WHERE user=?", user).Scan(&u.User, &u.Password)
if err == sql.ErrNoRows {
err = ErrNoSuchUser
}
return
}
// Put updates user data in the database.
// Set new to true to create or false to update.
func (u *User) Put(tx *sql.Tx, new bool) (err error) {
if new {
_, err = tx.Exec("INSERT INTO users (user, password) VALUES (?, ?)", u.User, u.Password)
} else {
_, err = tx.Exec("UPDATE users SET password=? WHERE user=?", u.Password, u.User)
}
return
}
// Delete deletes a user.
func (u *User) Delete(tx *sql.Tx) (err error) {
var r sql.Result
if r, err = tx.Exec("DELETE FROM users WHERE user=?", u.User); err != nil {
return
}
var rows int64
if rows, err = r.RowsAffected(); err != nil {
return
}
if rows != 1 {
err = ErrNoSuchUser
return
}
return
}