diff --git a/http/resource.go b/http/resource.go index f03f17fb..f657856e 100644 --- a/http/resource.go +++ b/http/resource.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "io" + "log" "net/http" "net/url" "os" @@ -73,6 +74,11 @@ func resourceDeleteHandler(fileCache FileCache) handleFunc { return errToStatus(err), err } + err = d.store.Share.DeleteWithPathPrefix(file.Path) + if err != nil { + log.Printf("WARNING: Error(s) occurred while deleting associated shares with file: %s", err) + } + // delete thumbnails err = delThumbs(r.Context(), fileCache, file) if err != nil { diff --git a/share/storage.go b/share/storage.go index 4cd263de..398c192d 100644 --- a/share/storage.go +++ b/share/storage.go @@ -15,6 +15,7 @@ type StorageBackend interface { Gets(path string, id uint) ([]*Link, error) Save(s *Link) error Delete(hash string) error + DeleteWithPathPrefix(path string) error } // Storage is a storage. @@ -118,3 +119,7 @@ func (s *Storage) Save(l *Link) error { func (s *Storage) Delete(hash string) error { return s.back.Delete(hash) } + +func (s *Storage) DeleteWithPathPrefix(path string) error { + return s.back.DeleteWithPathPrefix(path) +} diff --git a/storage/bolt/share.go b/storage/bolt/share.go index 6df94f12..373533f1 100644 --- a/storage/bolt/share.go +++ b/storage/bolt/share.go @@ -75,3 +75,16 @@ func (s shareBackend) Delete(hash string) error { } return err } + +func (s shareBackend) DeleteWithPathPrefix(pathPrefix string) error { + var links []share.Link + if err := s.db.Prefix("Path", pathPrefix, &links); err != nil { + return err + } + + var err error + for _, link := range links { + err = errors.Join(err, s.db.DeleteStruct(&share.Link{Hash: link.Hash})) + } + return err +}