canape/backend/admins/users.go
Grégoire Delattre 1197e6ce6c Move the tokens into the models
By the way, move he sqly package in the models as well
2020-03-02 13:07:04 +01:00

178 lines
4.0 KiB
Go

package admin
import (
"database/sql"
"encoding/json"
"fmt"
"net/http"
"git.quimbo.fr/odwrtw/canape/backend/events"
"git.quimbo.fr/odwrtw/canape/backend/models"
"git.quimbo.fr/odwrtw/canape/backend/web"
"github.com/gorilla/mux"
"github.com/sirupsen/logrus"
)
// GetUsersHandler returns the user list
func GetUsersHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
log := env.Log.WithFields(logrus.Fields{
"function": "admin.GetUsersHandler",
})
log.Debug("Getting users")
// Get all users
users, err := models.GetAllUsers(env.Database)
if err != nil {
return env.RenderError(w, err)
}
// Get all polochons
polochons, err := models.GetAllPolochons(env.Database)
if err != nil {
return env.RenderError(w, err)
}
// Map the polochons
polochonMap := map[string]*models.Polochon{}
for _, p := range polochons {
polochonMap[p.ID] = p
}
// Fill the users with the polochons
for _, u := range users {
if !u.PolochonID.Valid {
continue
}
u.Polochon = polochonMap[u.PolochonID.String]
}
return env.RenderJSON(w, users)
}
// GenerateUserToken generates a user token
func GenerateUserToken(env *web.Env, w http.ResponseWriter, r *http.Request) error {
log := env.Log.WithFields(logrus.Fields{
"function": "admin.GenerateUserToken",
})
log.Debug("Generating user token")
vars := mux.Vars(r)
username := vars["username"]
user, err := models.GetUser(env.Database, username)
if err != nil {
return err
}
t, err := env.Auth.GenerateJWTToken(r, user)
if err != nil {
return err
}
t.Description = "generated token for polochon"
if err := t.Add(env.Database); err != nil {
return err
}
return env.RenderJSON(w, t)
}
// UpdateUserHandler updates the user data
func UpdateUserHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
log := env.Log.WithFields(logrus.Fields{
"function": "admin.UpdateUserHandler",
})
var data struct {
ID string `json:"userId"`
Admin bool `json:"admin"`
Activated bool `json:"activated"`
PolochonID string `json:"polochonId"`
PolochonToken string `json:"polochonToken"`
PolochonActivated bool `json:"polochonActivated"`
Password string `json:"password"`
}
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
return err
}
if data.ID == "" {
return env.RenderError(w, fmt.Errorf("Empty user id"))
}
user, err := models.GetUserByID(env.Database, data.ID)
if err != nil {
return err
}
user.Admin = data.Admin
user.Activated = data.Activated
user.PolochonActivated = data.PolochonActivated
user.PolochonID = sql.NullString{
String: data.PolochonID,
Valid: true,
}
user.Token = data.PolochonToken
if data.Password != "" {
// Update the user config
var err error
user.Hash, err = env.Auth.GenHash(data.Password)
if err != nil {
return err
}
}
log.Debugf("updating user")
// Need to unsubscribe the user from all the eventers
events.Unsubscribe(user)
// Save the user with the new configurations
if err := user.Update(env.Database); err != nil {
return err
}
return env.RenderOK(w, "user updated")
}
// DeleteUserHandler deletes a user from the database
func DeleteUserHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
log := env.Log.WithFields(logrus.Fields{
"function": "admin.DeleteUserHandler",
})
vars := mux.Vars(r)
username := vars["username"]
user, err := models.GetUser(env.Database, username)
if err != nil {
return err
}
log = log.WithField("username", user.Name)
log.Infof("deleting movies wishlist")
if err := models.DeleteUserMoviesWishlist(env.Database, user.ID); err != nil {
return err
}
log.Infof("deleting shows wishlist")
if err := models.DeleteUserShowsWishlist(env.Database, user.ID); err != nil {
return err
}
log.Infof("deleting user tokens")
if err := models.DeleteUserTokens(env.Database, user.Name); err != nil {
return err
}
log.Infof("deleting user")
if err := user.Delete(env.Database); err != nil {
return err
}
return env.RenderOK(w, "user deleted")
}