package bolt import ( "errors" "github.com/asdine/storm/v3" "github.com/asdine/storm/v3/q" fbErrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/share" ) type shareBackend struct { db *storm.DB } func (s shareBackend) All() ([]*share.Link, error) { var v []*share.Link err := s.db.All(&v) if errors.Is(err, storm.ErrNotFound) { return v, fbErrors.ErrNotExist } return v, err } func (s shareBackend) FindByUserID(id uint) ([]*share.Link, error) { var v []*share.Link err := s.db.Select(q.Eq("UserID", id)).Find(&v) if errors.Is(err, storm.ErrNotFound) { return v, fbErrors.ErrNotExist } return v, err } func (s shareBackend) GetByHash(hash string) (*share.Link, error) { var v share.Link err := s.db.One("Hash", hash, &v) if errors.Is(err, storm.ErrNotFound) { return nil, fbErrors.ErrNotExist } return &v, err } func (s shareBackend) GetPermanent(path string, id uint) (*share.Link, error) { var v share.Link err := s.db.Select(q.Eq("Path", path), q.Eq("Expire", 0), q.Eq("UserID", id)).First(&v) if errors.Is(err, storm.ErrNotFound) { return nil, fbErrors.ErrNotExist } return &v, err } func (s shareBackend) Gets(path string, id uint) ([]*share.Link, error) { var v []*share.Link err := s.db.Select(q.Eq("Path", path), q.Eq("UserID", id)).Find(&v) if errors.Is(err, storm.ErrNotFound) { return v, fbErrors.ErrNotExist } return v, err } func (s shareBackend) Save(l *share.Link) error { return s.db.Save(l) } func (s shareBackend) Delete(hash string) error { err := s.db.DeleteStruct(&share.Link{Hash: hash}) if errors.Is(err, storm.ErrNotFound) { return nil } 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 }