This repository has been archived by the owner on Dec 10, 2020. It is now read-only.
/
users.go
117 lines (97 loc) · 3.36 KB
/
users.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package store
import (
"github.com/danjac/podbaby/models"
"github.com/danjac/podbaby/store/Godeps/_workspace/src/github.com/jmoiron/sqlx"
)
// UserWriter does writes to user data store
type UserWriter interface {
// Create adds a new user to the data store
Create(DataHandler, *models.User) error
// UpdateEmail updates email address in the data store
UpdateEmail(DataHandler, string, int) error
// UpdatePassword updates password in the data store
UpdatePassword(DataHandler, string, int) error
// DeleteUser removes user from data store
DeleteUser(DataHandler, int) error
}
// UserReader does reads from user data store
type UserReader interface {
// GetbYID retrieves user by ID from the data store
GetByID(DataHandler, *models.User, int) error
// GetNameOrEmail retrieves user by name or email from the data store
GetByNameOrEmail(DataHandler, *models.User, string) error
// IsName checks if a user name exists in the data store
IsName(DataHandler, string) (bool, error)
// IsEmail checks if an email exists in the data store
IsEmail(DataHandler, string, int) (bool, error)
}
// UserStore manages the user data store
type UserStore interface {
UserReader
UserWriter
}
// UserStore handles all user queries
type userSQLStore struct {
UserReader
UserWriter
}
func newUserStore() UserStore {
return &userSQLStore{
UserWriter: &userSQLWriter{},
UserReader: &userSQLReader{},
}
}
type userSQLWriter struct{}
func (w *userSQLWriter) UpdateEmail(dh DataHandler, email string, userID int) error {
q := "UPDATE users SET email=$1 WHERE id=$2"
_, err := dh.Exec(q, email, userID)
return handleError(err, q)
}
func (w *userSQLWriter) UpdatePassword(dh DataHandler, password string, userID int) error {
q := "UPDATE users SET password=$1 WHERE id=$2"
_, err := dh.Exec(q, password, userID)
return handleError(err, q)
}
func (w *userSQLWriter) Create(dh DataHandler, user *models.User) error {
q := "INSERT INTO users(name, email, password) VALUES (:name, :email, :password) RETURNING id"
q, args, err := sqlx.Named(q, user)
if err != nil {
return handleError(err, q)
}
return handleError(dh.QueryRowx(dh.Rebind(q), args...).Scan(&user.ID), q)
}
func (w *userSQLWriter) DeleteUser(dh DataHandler, userID int) error {
q := "DELETE FROM users WHERE id=$1"
_, err := dh.Exec(q, userID)
return handleError(err, q)
}
type userSQLReader struct{}
func (r *userSQLReader) GetByID(dh DataHandler, user *models.User, id int) error {
q := "SELECT * FROM users WHERE id=$1"
return handleError(sqlx.Get(dh, user, q, id), q)
}
func (r *userSQLReader) GetByNameOrEmail(dh DataHandler, user *models.User, identifier string) error {
q := "SELECT * FROM users WHERE email=$1 or name=$1"
return handleError(sqlx.Get(dh, user, q, identifier), q)
}
func (r *userSQLReader) IsName(dh DataHandler, name string) (bool, error) {
q := "SELECT COUNT(id) FROM users WHERE name=$1"
var count int
if err := dh.QueryRowx(q, name).Scan(&count); err != nil {
return false, handleError(err, q)
}
return count > 0, nil
}
func (r *userSQLReader) IsEmail(dh DataHandler, email string, userID int) (bool, error) {
q := "SELECT COUNT(id) FROM users WHERE email ILIKE $1"
args := []interface{}{email}
if userID != 0 {
q += " AND id != $2"
args = append(args, userID)
}
var count int
if err := dh.QueryRowx(q, args...).Scan(&count); err != nil {
return false, handleError(err, q)
}
return count > 0, nil
}