184 lines
5.3 KiB
Go
184 lines
5.3 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/julienschmidt/httprouter"
|
|
)
|
|
|
|
var currentPromo uint = 0
|
|
|
|
func init() {
|
|
router.GET("/api/promos", apiHandler(
|
|
func(httprouter.Params, []byte) HTTPResponse {
|
|
return formatApiResponse(getPromos())
|
|
}, adminRestricted))
|
|
router.GET("/api/users", apiHandler(
|
|
func(httprouter.Params, []byte) HTTPResponse {
|
|
return formatApiResponse(getUsers())
|
|
}, adminRestricted))
|
|
router.GET("/api/users/:uid", apiHandler(userHandler(
|
|
func(u User, _ []byte) HTTPResponse {
|
|
return APIResponse{u}
|
|
}), loggedUser))
|
|
router.PUT("/api/users/:uid", apiHandler(userHandler(updateUser), adminRestricted))
|
|
router.DELETE("/api/users/:uid", apiHandler(userHandler(
|
|
func(u User, _ []byte) HTTPResponse {
|
|
return formatApiResponse(u.Delete())
|
|
}), adminRestricted))
|
|
}
|
|
|
|
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"`
|
|
Promo uint `json:"promo"`
|
|
Groups string `json:"groups"`
|
|
IsAdmin bool `json:"is_admin"`
|
|
}
|
|
|
|
func getUsers() (users []User, err error) {
|
|
if rows, errr := DBQuery("SELECT id_user, login, email, firstname, lastname, time, promo, groups, is_admin FROM users ORDER BY promo DESC, id_user DESC"); 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.Promo, &u.Groups, &u.IsAdmin); err != nil {
|
|
return
|
|
}
|
|
users = append(users, u)
|
|
}
|
|
if err = rows.Err(); err != nil {
|
|
return
|
|
}
|
|
|
|
return
|
|
}
|
|
}
|
|
|
|
func getPromos() (promos []uint, err error) {
|
|
if rows, errr := DBQuery("SELECT DISTINCT promo FROM users ORDER BY promo DESC"); errr != nil {
|
|
return nil, errr
|
|
} else {
|
|
defer rows.Close()
|
|
|
|
for rows.Next() {
|
|
var p uint
|
|
if err = rows.Scan(&p); err != nil {
|
|
return
|
|
}
|
|
promos = append(promos, p)
|
|
}
|
|
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, promo, groups, is_admin FROM users WHERE id_user=?", id).Scan(&u.Id, &u.Login, &u.Email, &u.Firstname, &u.Lastname, &u.Time, &u.Promo, &u.Groups, &u.IsAdmin)
|
|
return
|
|
}
|
|
|
|
func getUserByLogin(login string) (u User, err error) {
|
|
err = DBQueryRow("SELECT id_user, login, email, firstname, lastname, time, promo, groups, is_admin FROM users WHERE login=?", login).Scan(&u.Id, &u.Login, &u.Email, &u.Firstname, &u.Lastname, &u.Time, &u.Promo, &u.Groups, &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, groups string) (User, error) {
|
|
t := time.Now()
|
|
if res, err := DBExec("INSERT INTO users (login, email, firstname, lastname, time, promo, groups) VALUES (?, ?, ?, ?, ?, ?, ?)", login, email, firstname, lastname, t, currentPromo, groups); 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, currentPromo, groups, false}, nil
|
|
}
|
|
}
|
|
|
|
func (u User) Update() (int64, error) {
|
|
if res, err := DBExec("UPDATE users SET login = ?, email = ?, firstname = ?, lastname = ?, time = ?, promo = ?, groups = ? WHERE id_user = ?", u.Login, u.Email, u.Firstname, u.Lastname, u.Time, u.Promo, u.Groups, 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
|
|
current.Promo = new.Promo
|
|
current.Groups = new.Groups
|
|
return formatApiResponse(current.Update())
|
|
}
|