feat: recursively remove shares when folder/file is deleted
parent
47b3e218ad
commit
7398478d29
|
@ -65,7 +65,7 @@ func resourceDeleteHandler(fileCache FileCache) handleFunc {
|
||||||
Fs: d.user.Fs,
|
Fs: d.user.Fs,
|
||||||
Path: r.URL.Path,
|
Path: r.URL.Path,
|
||||||
Modify: d.user.Perm.Modify,
|
Modify: d.user.Perm.Modify,
|
||||||
Expand: false,
|
Expand: true,
|
||||||
ReadHeader: d.server.TypeDetectionByHeader,
|
ReadHeader: d.server.TypeDetectionByHeader,
|
||||||
Checker: d,
|
Checker: d,
|
||||||
})
|
})
|
||||||
|
@ -73,6 +73,11 @@ func resourceDeleteHandler(fileCache FileCache) handleFunc {
|
||||||
return errToStatus(err), err
|
return errToStatus(err), err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// delete potential shares for this path
|
||||||
|
for _, path := range flatListFilePaths(file, d) {
|
||||||
|
d.store.Share.DeleteWithPath(path)
|
||||||
|
}
|
||||||
|
|
||||||
// delete thumbnails
|
// delete thumbnails
|
||||||
err = delThumbs(r.Context(), fileCache, file)
|
err = delThumbs(r.Context(), fileCache, file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -332,6 +337,41 @@ func patchAction(ctx context.Context, action, src, dst string, d *data, fileCach
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func flatListFilePaths(fileInfo *files.FileInfo, d *data) []string {
|
||||||
|
var paths []string
|
||||||
|
|
||||||
|
paths = append(paths, fileInfo.Path)
|
||||||
|
|
||||||
|
if (!fileInfo.isDir) {
|
||||||
|
return paths
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, item := range fileInfo.Items {
|
||||||
|
// no need to add the directory's path here as it will provide itself in the next recursion
|
||||||
|
if (item.IsDir) {
|
||||||
|
file, err := files.NewFileInfo(&files.FileOptions{
|
||||||
|
Fs: item.Fs,
|
||||||
|
Path: item.Path + "/", // ensure we add the suffix "/" for a directory
|
||||||
|
Modify: false,
|
||||||
|
Expand: true,
|
||||||
|
ReadHeader: false,
|
||||||
|
Checker: d,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (err != nil) {
|
||||||
|
return paths
|
||||||
|
}
|
||||||
|
|
||||||
|
deeperFiles := flatListFilePaths(file, d)
|
||||||
|
paths = append(paths, deeperFiles...)
|
||||||
|
} else {
|
||||||
|
paths = append(paths, item.Path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return paths
|
||||||
|
}
|
||||||
|
|
||||||
type DiskUsageResponse struct {
|
type DiskUsageResponse struct {
|
||||||
Total uint64 `json:"total"`
|
Total uint64 `json:"total"`
|
||||||
Used uint64 `json:"used"`
|
Used uint64 `json:"used"`
|
||||||
|
|
|
@ -15,6 +15,7 @@ type StorageBackend interface {
|
||||||
Gets(path string, id uint) ([]*Link, error)
|
Gets(path string, id uint) ([]*Link, error)
|
||||||
Save(s *Link) error
|
Save(s *Link) error
|
||||||
Delete(hash string) error
|
Delete(hash string) error
|
||||||
|
DeleteWithPath(path string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Storage is a storage.
|
// Storage is a storage.
|
||||||
|
@ -118,3 +119,7 @@ func (s *Storage) Save(l *Link) error {
|
||||||
func (s *Storage) Delete(hash string) error {
|
func (s *Storage) Delete(hash string) error {
|
||||||
return s.back.Delete(hash)
|
return s.back.Delete(hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Storage) DeleteWithPath(path string) error {
|
||||||
|
return s.back.DeleteWithPath(path)
|
||||||
|
}
|
||||||
|
|
|
@ -75,3 +75,11 @@ func (s shareBackend) Delete(hash string) error {
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s shareBackend) DeleteWithPath(path string) error {
|
||||||
|
err := s.db.Select(q.Eq("Path", path)).Delete(&share.Link{})
|
||||||
|
if errors.Is(err, storm.ErrNotFound) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue