From 7ee1aec3b7568cb322e11fe5ccb551035fa78193 Mon Sep 17 00:00:00 2001 From: Alborz Jafari Date: Thu, 31 Aug 2023 22:12:06 +0300 Subject: [PATCH] Delete media files/directories along with corresponding posts/users --- admin.go | 12 ++++++++++++ posts.go | 19 ++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/admin.go b/admin.go index 6408cfe..04e56d9 100644 --- a/admin.go +++ b/admin.go @@ -12,12 +12,14 @@ package writefreely import ( "database/sql" + "path/filepath" "fmt" "net/http" "runtime" "strconv" "strings" "time" + "os" "github.com/gorilla/mux" "github.com/writeas/impart" @@ -341,10 +343,20 @@ func handleAdminDeleteUser(app *App, u *User, w http.ResponseWriter, r *http.Req return impart.HTTPError{http.StatusInternalServerError, fmt.Sprintf("Could not delete user account for '%s': %v", username, err)} } + deleteMediaFilesOfUser(app, username) _ = addSessionFlash(app, w, r, fmt.Sprintf("User \"%s\" was deleted successfully.", username), nil) return impart.HTTPError{http.StatusFound, "/admin/users"} } +func deleteMediaFilesOfUser(app *App, username string) { + mediaDirectoryPath := filepath.Join(app.cfg.Server.MediaParentDir, mediaDir, + username) + err := os.RemoveAll(mediaDirectoryPath) + if err != nil { + log.Error("Deleting media directory of %s failed: %v", username, err) + } +} + func handleAdminToggleUserStatus(app *App, u *User, w http.ResponseWriter, r *http.Request) error { vars := mux.Vars(r) username := vars["username"] diff --git a/posts.go b/posts.go index 0a6a6e0..0c77906 100644 --- a/posts.go +++ b/posts.go @@ -13,6 +13,7 @@ package writefreely import ( "database/sql" "encoding/json" + "path/filepath" "errors" "fmt" "html/template" @@ -21,6 +22,7 @@ import ( "regexp" "strings" "time" + "os" "github.com/gorilla/mux" "github.com/guregu/null" @@ -799,6 +801,13 @@ func deletePost(app *App, w http.ResponseWriter, r *http.Request) error { vars := mux.Vars(r) friendlyID := vars["post"] editToken := r.FormValue("token") + var err error + + user := getUserSession(app, r) + slug, err := getSlugFromActionId(app, friendlyID) + if err == nil { + deleteMediaFilesOfPost(app, user.Username, slug) + } var ownerID int64 var u *User @@ -812,7 +821,6 @@ func deletePost(app *App, w http.ResponseWriter, r *http.Request) error { var res sql.Result var t *sql.Tx - var err error var collID sql.NullInt64 var coll *Collection var pp *PublicPost @@ -911,6 +919,15 @@ func deletePost(app *App, w http.ResponseWriter, r *http.Request) error { return impart.HTTPError{Status: http.StatusNoContent} } +func deleteMediaFilesOfPost(app *App, username, slug string) { + mediaDirectoryPath := filepath.Join(app.cfg.Server.MediaParentDir, mediaDir, + username, slug) + err := os.RemoveAll(mediaDirectoryPath) + if err != nil { + log.Error("Deleting media directory of %s failed: %v", username, err) + } +} + // addPost associates a post with the authenticated user. func addPost(app *App, w http.ResponseWriter, r *http.Request) error { var ownerID int64