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"
)
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 }
} ) ) )
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" `
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 {
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
return formatApiResponse ( current . Update ( ) )
}