diff --git a/backend/admins/users.go b/backend/admins/users.go index 3fc4291..1eadef0 100644 --- a/backend/admins/users.go +++ b/backend/admins/users.go @@ -8,6 +8,7 @@ import ( "git.quimbo.fr/odwrtw/canape/backend/events" "git.quimbo.fr/odwrtw/canape/backend/models" + "git.quimbo.fr/odwrtw/canape/backend/tokens" "git.quimbo.fr/odwrtw/canape/backend/web" "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") } + +// 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") +} diff --git a/backend/models/movie_wishlist.go b/backend/models/movie_wishlist.go index 84011ae..cac66a6 100644 --- a/backend/models/movie_wishlist.go +++ b/backend/models/movie_wishlist.go @@ -32,6 +32,8 @@ const ( 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;` ) @@ -140,3 +142,9 @@ func GetAllWishlistedMovies(db *sqlx.DB) ([]string, error) { 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 +} diff --git a/backend/models/show_wishlist.go b/backend/models/show_wishlist.go index e4fd014..478e567 100644 --- a/backend/models/show_wishlist.go +++ b/backend/models/show_wishlist.go @@ -28,6 +28,8 @@ const ( 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;` ) @@ -151,3 +153,9 @@ func GetAllWishlistedShows(db *sqlx.DB) ([]string, error) { 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 +} diff --git a/backend/models/users.go b/backend/models/users.go index 1469deb..0687c24 100644 --- a/backend/models/users.go +++ b/backend/models/users.go @@ -144,10 +144,7 @@ func (u *User) Update(ex *sqlx.DB) error { // Delete user from database or raise an error func (u *User) Delete(ex *sqlx.DB) error { _, err := ex.NamedExec(deleteUserQuery, u) - if err != nil { - return err - } - return nil + return err } // HasRole checks if a user as a role diff --git a/backend/routes.go b/backend/routes.go index 320d874..2f9303d 100644 --- a/backend/routes.go +++ b/backend/routes.go @@ -89,6 +89,7 @@ func setupRoutes(env *web.Env) { // Admin routes 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/{username}", admin.DeleteUserHandler).WithRole(models.AdminRole).Methods("DELETE") 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/modules", admin.GetModulesStatuses).WithRole(models.AdminRole).Methods("GET") diff --git a/backend/tokens/tokens.go b/backend/tokens/tokens.go index e721d5d..934954f 100644 --- a/backend/tokens/tokens.go +++ b/backend/tokens/tokens.go @@ -6,8 +6,8 @@ import ( "fmt" "time" - "github.com/jmoiron/sqlx" "git.quimbo.fr/odwrtw/canape/backend/sqly" + "github.com/jmoiron/sqlx" ) const ( @@ -16,6 +16,7 @@ const ( getUserTokenQuery = `SELECT * FROM tokens WHERE username=$1 and token=$2;` getUserTokensQuery = `SELECT * FROM tokens WHERE username=$1;` 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 *;` ) @@ -86,6 +87,12 @@ func GetUserTokens(db *sqlx.DB, username string) ([]*Token, error) { 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 func (t *Token) Update(db *sqlx.DB) error { rows, err := db.NamedQuery(updateTokenQuery, t)