-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuser.go
More file actions
137 lines (110 loc) · 2.72 KB
/
user.go
File metadata and controls
137 lines (110 loc) · 2.72 KB
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package main
import(
"errors"
"code.google.com/p/go.crypto/bcrypt"
)
/*
User a user
*/
type User struct{
Username string `db:"username" json:"username"`
Email string `db:"email" json:"email"`
Role string `db:"role" json:"role"`
}
/*
Loginuser the same as User but the password, used for authentication purposes
*/
type Loginuser struct{
Username string `db:"username" json:"username"`
Password string `db:"password" json:"password"`
Email string `db:"email" json:"email"`
Role string `db:"role" json:"role"`
}
//Validates the role
func rolevalidation(r string) bool{
return (r == "admin" || r == "user")
}
/*
Hashpwd hashes the users password using bcrypt
*/
func (u *Loginuser) Hashpwd(){
b := []byte(u.Password)
r, err := bcrypt.GenerateFromPassword(b, 12)
if err != nil {
panic(err)
}
u.Password = string(r)
}
var userschema =
`
CREATE TABLE user(
username CHAR(256) PRIMARY KEY NOT NULL,
password text NOT NULL,
email text,
role text
);
`
/*
CreateUser creates a new user in the database
*/
func CreateUser(u Loginuser) (User, error){
//Validate role
if !rolevalidation(u.Role) {
return User{}, errors.New("invalid role")
}
u.Hashpwd()
_, err := db.NamedExec(
`INSERT INTO user (username, password, email, role)
VALUES(:username, :password, :email, :role)`, u)
if err != nil{
return User{}, errors.New("user already exists")
}
return User{u.Username, u.Email, u.Role}, nil
}
/*
UpdateUser updates the user in the database
*/
func UpdateUser(u Loginuser) (User, error){
if !rolevalidation(u.Role){
return User{}, errors.New("invalid role")
}
u.Hashpwd()
_, err := db.NamedExec(
`UPDATE user SET password=:password, email=:email,
role=:role WHERE username=:username`, u)
if err != nil{
return User{}, errors.New("could not update user")
}
return User{u.Username, u.Email, u.Role}, nil
}
/*
DeleteUser deletes the user from the database
*/
func DeleteUser(name string) error{
_, err := db.Exec(`DELETE FROM user WHERE username=$1`, name)
return err
}
/*
GetUser gets the user from the database
*/
func GetUser(name string) (User, error){
u := User{}
err := db.Get(&u, `SELECT username, email, role
FROM user WHERE username=$1`, name)
return u, err
}
/*
GetUsers gets all users
*/
func GetUsers() []User {
users := []User{}
db.Select(&users, "SELECT username, email, role FROM user")
return users
}
//Get a loginuser
func getloginuser(name string) (Loginuser, error){
u := Loginuser{}
err := db.Get(&u, `SELECT username, password, email, role
FROM user WHERE username=$1`, name)
return u, err
}