Initial commit
This commit is contained in:
commit
f073e69417
28 changed files with 2564 additions and 0 deletions
152
users.go
Normal file
152
users.go
Normal file
|
@ -0,0 +1,152 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"time"
|
||||
"strconv"
|
||||
|
||||
"github.com/julienschmidt/httprouter"
|
||||
)
|
||||
|
||||
func init() {
|
||||
router.GET("/api/users", apiHandler(
|
||||
func(httprouter.Params, []byte) HTTPResponse {
|
||||
return formatApiResponse(getUsers())
|
||||
}))
|
||||
router.GET("/api/users/:uid", apiHandler(userHandler(
|
||||
func(u User, _ []byte) HTTPResponse {
|
||||
return APIResponse{u}
|
||||
})))
|
||||
router.PUT("/api/users/:uid", apiHandler(userHandler(updateUser)))
|
||||
router.DELETE("/api/users/:uid", apiHandler(userHandler(
|
||||
func(u User, _ []byte) HTTPResponse {
|
||||
return formatApiResponse(u.Delete())
|
||||
})))
|
||||
}
|
||||
|
||||
func userHandler(f func(User, []byte) HTTPResponse) func(httprouter.Params, []byte) HTTPResponse {
|
||||
return func(ps httprouter.Params, body []byte) HTTPResponse {
|
||||
if uid, err := strconv.Atoi(string(ps.ByName("uid"))); err != nil {
|
||||
if user, err := getUserByLogin(ps.ByName("uid")); err != nil {
|
||||
return APIErrorResponse{err:err}
|
||||
} else {
|
||||
return f(user, body)
|
||||
}
|
||||
} else if user, err := getUser(uid); err != nil {
|
||||
return APIErrorResponse{err:err}
|
||||
} else {
|
||||
return f(user, body)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type User struct {
|
||||
Id int64 `json:"id"`
|
||||
Login string `json:"login"`
|
||||
Email string `json:"email"`
|
||||
Firstname string `json:"firstname"`
|
||||
Lastname string `json:"lastname"`
|
||||
Time time.Time `json:"time"`
|
||||
IsAdmin bool `json:"is_admin"`
|
||||
}
|
||||
|
||||
func getUsers() (users []User, err error) {
|
||||
if rows, errr := DBQuery("SELECT id_user, login, email, firstname, lastname, time, is_admin FROM users"); errr != nil {
|
||||
return nil, errr
|
||||
} else {
|
||||
defer rows.Close()
|
||||
|
||||
for rows.Next() {
|
||||
var u User
|
||||
if err = rows.Scan(&u.Id, &u.Login, &u.Email, &u.Firstname, &u.Lastname, &u.Time, &u.IsAdmin); err != nil {
|
||||
return
|
||||
}
|
||||
users = append(users, u)
|
||||
}
|
||||
if err = rows.Err(); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
func getUser(id int) (u User, err error) {
|
||||
err = DBQueryRow("SELECT id_user, login, email, firstname, lastname, time, is_admin FROM users WHERE id_user=?", id).Scan(&u.Id, &u.Login, &u.Email, &u.Firstname, &u.Lastname, &u.Time, &u.IsAdmin)
|
||||
return
|
||||
}
|
||||
|
||||
func getUserByLogin(login string) (u User, err error) {
|
||||
err = DBQueryRow("SELECT id_user, login, email, firstname, lastname, time, is_admin FROM users WHERE login=?", login).Scan(&u.Id, &u.Login, &u.Email, &u.Firstname, &u.Lastname, &u.Time, &u.IsAdmin)
|
||||
return
|
||||
}
|
||||
|
||||
func userExists(login string) bool {
|
||||
var z int
|
||||
err := DBQueryRow("SELECT 1 FROM users WHERE login=?", login).Scan(&z)
|
||||
return err == nil && z == 1
|
||||
}
|
||||
|
||||
func NewUser(login string, email string, firstname string, lastname string) (User, error) {
|
||||
t := time.Now()
|
||||
if res, err := DBExec("INSERT INTO users (login, email, firstname, lastname, time) VALUES (?, ?, ?, ?, ?)", login, email, firstname, lastname, t); err != nil {
|
||||
return User{}, err
|
||||
} else if sid, err := res.LastInsertId(); err != nil {
|
||||
return User{}, err
|
||||
} else {
|
||||
return User{sid, login, email, firstname, lastname, t, false}, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (u User) Update() (int64, error) {
|
||||
if res, err := DBExec("UPDATE users SET login = ?, email = ?, firstname = ?, lastname = ?, time = ? WHERE id_user = ?", u.Login, u.Email, u.Firstname, u.Lastname, u.Time, u.Id); err != nil {
|
||||
return 0, err
|
||||
} else if nb, err := res.RowsAffected(); err != nil {
|
||||
return 0, err
|
||||
} else {
|
||||
return nb, err
|
||||
}
|
||||
}
|
||||
|
||||
func (u User) MakeAdmin(value bool) (User, error) {
|
||||
if _, err := DBExec("UPDATE users SET is_admin = ? WHERE id_user = ?", value, u.Id); err != nil {
|
||||
return u, err
|
||||
} else {
|
||||
u.IsAdmin = value
|
||||
return u, err
|
||||
}
|
||||
}
|
||||
|
||||
func (u User) Delete() (int64, error) {
|
||||
if res, err := DBExec("DELETE FROM users WHERE id_user = ?", u.Id); err != nil {
|
||||
return 0, err
|
||||
} else if nb, err := res.RowsAffected(); err != nil {
|
||||
return 0, err
|
||||
} else {
|
||||
return nb, err
|
||||
}
|
||||
}
|
||||
|
||||
func ClearUsers() (int64, error) {
|
||||
if res, err := DBExec("DELETE FROM users"); err != nil {
|
||||
return 0, err
|
||||
} else if nb, err := res.RowsAffected(); err != nil {
|
||||
return 0, err
|
||||
} else {
|
||||
return nb, err
|
||||
}
|
||||
}
|
||||
|
||||
func updateUser(current User, body []byte) HTTPResponse {
|
||||
var new User
|
||||
if err := json.Unmarshal(body, &new); err != nil {
|
||||
return APIErrorResponse{err:err}
|
||||
}
|
||||
|
||||
current.Login = new.Login
|
||||
current.Email = new.Email
|
||||
current.Firstname = new.Firstname
|
||||
current.Lastname = new.Lastname
|
||||
current.Time = new.Time
|
||||
return formatApiResponse(current.Update())
|
||||
}
|
Reference in a new issue