diff --git a/db/database.go b/db/database.go
index 9b6774a..7001117 100644
--- a/db/database.go
+++ b/db/database.go
@@ -243,6 +243,14 @@ func (db *mySQLdb) GetFile(fileID string) (*models.File, error) {
return &file, nil
}
+func (db *mySQLdb) DeleteFile(fileID string) error {
+ err := db.DB.Table("files").Where("id = ?", fileID).Delete(&models.File{}).Error
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
func (db *mySQLdb) GetUserFile(name string, ownerID string) (*models.File, error) {
var file models.File
err := db.DB.Table("files").Where("name = ? AND owner_id = ?", name, ownerID).First(&file).Error
@@ -403,6 +411,14 @@ func (db *postgresDB) GetFile(fileID string) (*models.File, error) {
return &file, nil
}
+func (db *postgresDB) DeleteFile(fileID string) error {
+ err := db.DB.Table("files").Where("id = $1", fileID).Delete(&models.File{}).Error
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
func (db *postgresDB) GetUserFile(name string, ownerID string) (*models.File, error) {
var file models.File
err := db.DB.Table("files").Where("name = $1 AND owner_id = $2", name, ownerID).First(&file).Error
diff --git a/handler/file/delete/delete.go b/handler/file/delete/delete.go
new file mode 100644
index 0000000..da4f1a5
--- /dev/null
+++ b/handler/file/delete/delete.go
@@ -0,0 +1,45 @@
+package deleteHandler
+
+import (
+ "github.com/fossyy/filekeeper/app"
+ "github.com/fossyy/filekeeper/types"
+ "net/http"
+ "os"
+ "path/filepath"
+)
+
+func DELETE(w http.ResponseWriter, r *http.Request) {
+ fileID := r.PathValue("id")
+ consent := r.URL.Query().Get("consent")
+ userSession := r.Context().Value("user").(types.User)
+
+ file, err := app.Server.Database.GetFile(fileID)
+ if err != nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ if userSession.UserID != file.OwnerID || consent != "true" {
+ w.WriteHeader(http.StatusUnauthorized)
+ return
+ }
+
+ err = app.Server.Database.DeleteFile(fileID)
+ if err != nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ uploadDir := "uploads"
+ currentDir, _ := os.Getwd()
+ basePath := filepath.Join(currentDir, uploadDir)
+ fileFolder := filepath.Join(basePath, file.OwnerID.String(), file.ID.String())
+ err = os.RemoveAll(fileFolder)
+ if err != nil {
+ w.WriteHeader(http.StatusInternalServerError)
+ return
+ }
+
+ w.WriteHeader(http.StatusOK)
+ return
+}
diff --git a/routes/client/routes.go b/routes/client/routes.go
index fec6b44..9d2ee05 100644
--- a/routes/client/routes.go
+++ b/routes/client/routes.go
@@ -6,6 +6,7 @@ import (
googleOauthSetupHandler "github.com/fossyy/filekeeper/handler/auth/google/setup"
totpHandler "github.com/fossyy/filekeeper/handler/auth/totp"
fileHandler "github.com/fossyy/filekeeper/handler/file"
+ deleteHandler "github.com/fossyy/filekeeper/handler/file/delete"
downloadHandler "github.com/fossyy/filekeeper/handler/file/download"
uploadHandler "github.com/fossyy/filekeeper/handler/file/upload"
visibilityHandler "github.com/fossyy/filekeeper/handler/file/visibility"
@@ -118,6 +119,10 @@ func SetupRoutes() *http.ServeMux {
middleware.Auth(uploadHandler.POST, w, r)
})
+ handler.HandleFunc("DELETE /file/{id}", func(w http.ResponseWriter, r *http.Request) {
+ middleware.Auth(deleteHandler.DELETE, w, r)
+ })
+
handler.HandleFunc("GET /file/{id}", func(w http.ResponseWriter, r *http.Request) {
downloadHandler.GET(w, r)
})
diff --git a/types/types.go b/types/types.go
index 98eef82..83817fd 100644
--- a/types/types.go
+++ b/types/types.go
@@ -60,6 +60,7 @@ type Database interface {
CreateFile(file *models.File) error
GetFile(fileID string) (*models.File, error)
+ DeleteFile(fileID string) error
GetUserFile(name string, ownerID string) (*models.File, error)
GetFiles(ownerID string) ([]*models.File, error)
IncrementDownloadCount(fileID string) error
diff --git a/view/client/file/file.templ b/view/client/file/file.templ
index 646faee..d90d788 100644
--- a/view/client/file/file.templ
+++ b/view/client/file/file.templ
@@ -54,6 +54,26 @@ templ MainContent(files []types.FileData, user types.User, allowance *types.Allo
+
@@ -205,7 +225,7 @@ templ MainContent(files []types.FileData, user types.User, allowance *types.Allo
Rename
-