diff --git a/server/internal/api/v1/fs/rm.go b/server/internal/api/v1/fs/rm.go index b8f45d30..0a45c487 100644 --- a/server/internal/api/v1/fs/rm.go +++ b/server/internal/api/v1/fs/rm.go @@ -17,9 +17,9 @@ func handleRmRequest(c *gin.Context) { if err != nil { panic(err) } - if err := r.DeleteRecursive(true); err != nil { + if r, err := r.DeleteRecursive(true); err != nil { panic(err) + } else { + c.JSON(200, ResponseFromResourceInfo(r)) } - - c.JSON(200, gin.H{}) } diff --git a/server/internal/api/webdav/impl/webdav.go b/server/internal/api/webdav/impl/webdav.go index 0b264108..2b0ff2fd 100644 --- a/server/internal/api/webdav/impl/webdav.go +++ b/server/internal/api/webdav/impl/webdav.go @@ -237,7 +237,7 @@ func (h *Handler) handleDelete(_ http.ResponseWriter, r *http.Request) (status i return http.StatusNotFound, err } return http.StatusMethodNotAllowed, err - } else if err := r.DeleteRecursive(false); err != nil { + } else if _, err := r.DeleteRecursive(false); err != nil { return http.StatusMethodNotAllowed, err } return http.StatusNoContent, nil diff --git a/server/internal/command/fs/import.go b/server/internal/command/fs/import.go index 7ddfdb6a..7ac313ce 100644 --- a/server/internal/command/fs/import.go +++ b/server/internal/command/fs/import.go @@ -113,7 +113,7 @@ func setupImportCommand() *cobra.Command { err = db.Get().WithTx(ctx, func(dbh *db.DbHandler) error { f := f.WithDb(dbh) if force { - if err := destParent.DeleteChildRecursive(destName, false); !errors.Is(err, fs.ErrResourceNotFound) { + if _, err := destParent.DeleteChildRecursive(destName, false); !errors.Is(err, fs.ErrResourceNotFound) { return err } } else { diff --git a/server/internal/core/fs/copy_move.go b/server/internal/core/fs/copy_move.go index 09a410f4..b4f71479 100644 --- a/server/internal/core/fs/copy_move.go +++ b/server/internal/core/fs/copy_move.go @@ -52,7 +52,7 @@ func (r Resource) Move(target string, overwrite bool) (Resource, bool, error) { return r, deleted, r.f.db.WithTx(r.f.ctx, func(dbh *db.DbHandler) error { f := r.f.withDb(dbh) if overwrite { - if err := destParent.DeleteChildRecursive(destName, false); err == nil { + if _, err := destParent.DeleteChildRecursive(destName, false); err == nil { deleted = true } else if !errors.Is(err, ErrResourceNotFound) { return err @@ -144,7 +144,7 @@ func (r Resource) Copy(target string, id uuid.UUID, recursive, overwrite bool) ( err = r.f.db.WithTx(r.f.ctx, func(dbh *db.DbHandler) error { f := r.f.withDb(dbh) if overwrite { - if err := destParent.DeleteChildRecursive(destName, false); err == nil { + if _, err := destParent.DeleteChildRecursive(destName, false); err == nil { deleted = true } else if !errors.Is(err, ErrResourceNotFound) { return err diff --git a/server/internal/core/fs/delete.go b/server/internal/core/fs/delete.go index 22294998..ab90ed3b 100644 --- a/server/internal/core/fs/delete.go +++ b/server/internal/core/fs/delete.go @@ -2,6 +2,7 @@ package fs import ( "errors" + "time" "github.com/google/uuid" "github.com/jackc/pgx/v5" @@ -9,33 +10,43 @@ import ( "github.com/sirupsen/logrus" ) -func (r Resource) DeleteChildRecursive(name string, hardDelete bool) error { +func (r Resource) DeleteChildRecursive(name string, hardDelete bool) (ResourceInfo, error) { if !r.hasPermission(PermissionWrite) { - return ErrInsufficientPermissions + return ResourceInfo{}, ErrInsufficientPermissions } id, err := r.f.db.ChildResourceIDByName(r.f.ctx, db.ChildResourceIDByNameParams{Parent: r.ID(), Name: name}) if err != nil { if errors.Is(err, pgx.ErrNoRows) { - return ErrResourceNotFound + err = ErrResourceNotFound } - return err + return ResourceInfo{}, err } - return r.f.deleteRecursive(id, r.ID(), hardDelete) + if err := r.f.deleteRecursive(id, r.ID(), hardDelete); err != nil { + return ResourceInfo{}, err + } + deleted := time.Now() + r.Info.deleted = &deleted + return r.Info, nil } -func (r Resource) DeleteRecursive(hardDelete bool) error { +func (r Resource) DeleteRecursive(hardDelete bool) (ResourceInfo, error) { if r.ParentID() == nil { - return ErrInsufficientPermissions + return ResourceInfo{}, ErrInsufficientPermissions } parent, err := r.f.ResourceByID(*r.ParentID()) + if err == nil && !parent.hasPermission(PermissionWrite) { + err = ErrInsufficientPermissions + } if err != nil { - return err + return ResourceInfo{}, err } - if !parent.hasPermission(PermissionWrite) { - return ErrInsufficientPermissions + if err := r.f.deleteRecursive(r.ID(), r.ID(), hardDelete); err != nil { + return ResourceInfo{}, err } - return r.f.deleteRecursive(r.ID(), parent.ID(), hardDelete) + deleted := time.Now() + r.Info.deleted = &deleted + return r.Info, nil } func (f filesystem) deleteRecursive(id, parent uuid.UUID, hardDelete bool) error {