Implement the delete user function in the backend

This commit is contained in:
Grégoire Delattre 2020-01-07 12:52:40 +01:00
parent e8313c00b6
commit 7dee9e0a7c
6 changed files with 65 additions and 5 deletions

View File

@ -8,6 +8,7 @@ import (
"git.quimbo.fr/odwrtw/canape/backend/events" "git.quimbo.fr/odwrtw/canape/backend/events"
"git.quimbo.fr/odwrtw/canape/backend/models" "git.quimbo.fr/odwrtw/canape/backend/models"
"git.quimbo.fr/odwrtw/canape/backend/tokens"
"git.quimbo.fr/odwrtw/canape/backend/web" "git.quimbo.fr/odwrtw/canape/backend/web"
"github.com/gorilla/mux" "github.com/gorilla/mux"
@ -137,3 +138,41 @@ func UpdateUserHandler(env *web.Env, w http.ResponseWriter, r *http.Request) err
return env.RenderOK(w, "user updated") 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 := tokens.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")
}

View File

@ -32,6 +32,8 @@ const (
deleteMovieWishlistedQueryByID = `DELETE FROM movies_tracked WHERE imdb_id=$1 AND user_id=$2;` deleteMovieWishlistedQueryByID = `DELETE FROM movies_tracked WHERE imdb_id=$1 AND user_id=$2;`
deleteUserMoviesWishlist = `DELETE FROM movies_tracked WHERE user_id=$1;`
getAllWishlistedMovies = `SELECT DISTINCT(imdb_id) FROM movies_tracked;` getAllWishlistedMovies = `SELECT DISTINCT(imdb_id) FROM movies_tracked;`
) )
@ -140,3 +142,9 @@ func GetAllWishlistedMovies(db *sqlx.DB) ([]string, error) {
return movies, nil return movies, nil
} }
// DeleteUserMoviesWishlist deletes all the wishlisted movies of a user
func DeleteUserMoviesWishlist(db *sqlx.DB, userID string) error {
_, err := db.Exec(deleteUserMoviesWishlist, userID)
return err
}

View File

@ -28,6 +28,8 @@ const (
deleteShowWishlistedQueryByID = `DELETE FROM shows_tracked WHERE imdb_id=$1 AND user_id=$2;` deleteShowWishlistedQueryByID = `DELETE FROM shows_tracked WHERE imdb_id=$1 AND user_id=$2;`
deleteUserShowsWishlist = `DELETE FROM shows_tracked WHERE user_id=$1;`
getAllWishlistedShows = `SELECT DISTINCT(imdb_id) FROM shows_tracked;` getAllWishlistedShows = `SELECT DISTINCT(imdb_id) FROM shows_tracked;`
) )
@ -151,3 +153,9 @@ func GetAllWishlistedShows(db *sqlx.DB) ([]string, error) {
return shows, nil return shows, nil
} }
// DeleteUserShowsWishlist deletes all the wishlisted shows of a user
func DeleteUserShowsWishlist(db *sqlx.DB, userID string) error {
_, err := db.Exec(deleteUserShowsWishlist, userID)
return err
}

View File

@ -144,10 +144,7 @@ func (u *User) Update(ex *sqlx.DB) error {
// Delete user from database or raise an error // Delete user from database or raise an error
func (u *User) Delete(ex *sqlx.DB) error { func (u *User) Delete(ex *sqlx.DB) error {
_, err := ex.NamedExec(deleteUserQuery, u) _, err := ex.NamedExec(deleteUserQuery, u)
if err != nil {
return err return err
}
return nil
} }
// HasRole checks if a user as a role // HasRole checks if a user as a role

View File

@ -89,6 +89,7 @@ func setupRoutes(env *web.Env) {
// Admin routes // Admin routes
env.Handle("/admins/users", admin.GetUsersHandler).WithRole(models.AdminRole).Methods("GET") env.Handle("/admins/users", admin.GetUsersHandler).WithRole(models.AdminRole).Methods("GET")
env.Handle("/admins/users", admin.UpdateUserHandler).WithRole(models.AdminRole).Methods("POST") env.Handle("/admins/users", admin.UpdateUserHandler).WithRole(models.AdminRole).Methods("POST")
env.Handle("/admins/users/{username}", admin.DeleteUserHandler).WithRole(models.AdminRole).Methods("DELETE")
env.Handle("/admins/stats", admin.GetStatsHandler).WithRole(models.AdminRole).Methods("GET") env.Handle("/admins/stats", admin.GetStatsHandler).WithRole(models.AdminRole).Methods("GET")
env.Handle("/admins/tokens/{username}", admin.GenerateUserToken).WithRole(models.AdminRole).Methods("POST") env.Handle("/admins/tokens/{username}", admin.GenerateUserToken).WithRole(models.AdminRole).Methods("POST")
env.Handle("/admins/modules", admin.GetModulesStatuses).WithRole(models.AdminRole).Methods("GET") env.Handle("/admins/modules", admin.GetModulesStatuses).WithRole(models.AdminRole).Methods("GET")

View File

@ -6,8 +6,8 @@ import (
"fmt" "fmt"
"time" "time"
"github.com/jmoiron/sqlx"
"git.quimbo.fr/odwrtw/canape/backend/sqly" "git.quimbo.fr/odwrtw/canape/backend/sqly"
"github.com/jmoiron/sqlx"
) )
const ( const (
@ -16,6 +16,7 @@ const (
getUserTokenQuery = `SELECT * FROM tokens WHERE username=$1 and token=$2;` getUserTokenQuery = `SELECT * FROM tokens WHERE username=$1 and token=$2;`
getUserTokensQuery = `SELECT * FROM tokens WHERE username=$1;` getUserTokensQuery = `SELECT * FROM tokens WHERE username=$1;`
deleteTokenQuery = `DELETE FROM tokens WHERE username=$1 AND token=$2;` deleteTokenQuery = `DELETE FROM tokens WHERE username=$1 AND token=$2;`
deleteUserTokens = `DELETE FROM tokens WHERE username=$1;`
updateTokenQuery = `UPDATE tokens SET description=:description, user_agent=:user_agent, ip=:ip, last_used=now() WHERE token=:token RETURNING *;` updateTokenQuery = `UPDATE tokens SET description=:description, user_agent=:user_agent, ip=:ip, last_used=now() WHERE token=:token RETURNING *;`
) )
@ -86,6 +87,12 @@ func GetUserTokens(db *sqlx.DB, username string) ([]*Token, error) {
return tokens, nil return tokens, nil
} }
// DeleteUserTokens deletes all the user's tokens
func DeleteUserTokens(db *sqlx.DB, username string) error {
_, err := db.Exec(deleteUserTokens, username)
return err
}
// Update updates a token // Update updates a token
func (t *Token) Update(db *sqlx.DB) error { func (t *Token) Update(db *sqlx.DB) error {
rows, err := db.NamedQuery(updateTokenQuery, t) rows, err := db.NamedQuery(updateTokenQuery, t)