2020-03-04 11:07:12 +00:00
package main
import (
"encoding/json"
"strconv"
2020-11-20 14:46:52 +00:00
"time"
2020-03-04 11:07:12 +00:00
"github.com/julienschmidt/httprouter"
)
2021-03-01 16:47:00 +00:00
var currentPromo uint = 0
2020-03-04 11:07:12 +00:00
func init ( ) {
2021-11-18 11:12:28 +00:00
router . GET ( "/api/promos" , apiHandler (
func ( httprouter . Params , [ ] byte ) HTTPResponse {
return formatApiResponse ( getPromos ( ) )
} , adminRestricted ) )
2020-03-04 11:07:12 +00:00
router . GET ( "/api/users" , apiHandler (
func ( httprouter . Params , [ ] byte ) HTTPResponse {
return formatApiResponse ( getUsers ( ) )
2021-01-30 02:34:24 +00:00
} , adminRestricted ) )
2020-03-04 11:07:12 +00:00
router . GET ( "/api/users/:uid" , apiHandler ( userHandler (
func ( u User , _ [ ] byte ) HTTPResponse {
return APIResponse { u }
2021-01-30 02:34:24 +00:00
} ) , loggedUser ) )
2020-11-20 14:46:52 +00:00
router . PUT ( "/api/users/:uid" , apiHandler ( userHandler ( updateUser ) , adminRestricted ) )
2020-03-04 11:07:12 +00:00
router . DELETE ( "/api/users/:uid" , apiHandler ( userHandler (
func ( u User , _ [ ] byte ) HTTPResponse {
return formatApiResponse ( u . Delete ( ) )
2020-11-20 14:46:52 +00:00
} ) , adminRestricted ) )
2020-03-04 11:07:12 +00:00
}
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 {
2020-11-20 14:46:52 +00:00
return APIErrorResponse { err : err }
2020-03-04 11:07:12 +00:00
} else {
return f ( user , body )
}
} else if user , err := getUser ( uid ) ; err != nil {
2020-11-20 14:46:52 +00:00
return APIErrorResponse { err : err }
2020-03-04 11:07:12 +00:00
} 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" `
2021-03-01 16:47:00 +00:00
Promo uint ` json:"promo" `
2021-09-15 22:26:09 +00:00
Groups string ` json:"groups" `
2020-03-04 11:07:12 +00:00
IsAdmin bool ` json:"is_admin" `
}
func getUsers ( ) ( users [ ] User , err error ) {
2021-11-18 11:12:28 +00:00
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 {
2020-03-04 11:07:12 +00:00
return nil , errr
} else {
defer rows . Close ( )
for rows . Next ( ) {
var u User
2021-09-15 22:26:09 +00:00
if err = rows . Scan ( & u . Id , & u . Login , & u . Email , & u . Firstname , & u . Lastname , & u . Time , & u . Promo , & u . Groups , & u . IsAdmin ) ; err != nil {
2020-03-04 11:07:12 +00:00
return
}
users = append ( users , u )
}
if err = rows . Err ( ) ; err != nil {
return
}
return
}
}
2021-11-18 11:12:28 +00:00
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
}
}
2020-03-04 11:07:12 +00:00
func getUser ( id int ) ( u User , err error ) {
2021-09-15 22:26:09 +00:00
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 )
2020-03-04 11:07:12 +00:00
return
}
func getUserByLogin ( login string ) ( u User , err error ) {
2021-09-15 22:26:09 +00:00
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 )
2020-03-04 11:07:12 +00:00
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
}
2021-09-15 22:26:09 +00:00
func NewUser ( login string , email string , firstname string , lastname string , groups string ) ( User , error ) {
2020-03-04 11:07:12 +00:00
t := time . Now ( )
2021-09-15 22:26:09 +00:00
if res , err := DBExec ( "INSERT INTO users (login, email, firstname, lastname, time, promo, groups) VALUES (?, ?, ?, ?, ?, ?, ?)" , login , email , firstname , lastname , t , currentPromo , groups ) ; err != nil {
2020-03-04 11:07:12 +00:00
return User { } , err
} else if sid , err := res . LastInsertId ( ) ; err != nil {
return User { } , err
} else {
2021-09-15 22:26:09 +00:00
return User { sid , login , email , firstname , lastname , t , currentPromo , groups , false } , nil
2020-03-04 11:07:12 +00:00
}
}
func ( u User ) Update ( ) ( int64 , error ) {
2021-09-15 22:26:09 +00:00
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 {
2020-03-04 11:07:12 +00:00
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 {
2020-11-20 14:46:52 +00:00
return APIErrorResponse { err : err }
2020-03-04 11:07:12 +00:00
}
current . Login = new . Login
current . Email = new . Email
current . Firstname = new . Firstname
current . Lastname = new . Lastname
current . Time = new . Time
2021-03-01 16:47:00 +00:00
current . Promo = new . Promo
2021-09-15 22:26:09 +00:00
current . Groups = new . Groups
2020-03-04 11:07:12 +00:00
return formatApiResponse ( current . Update ( ) )
}