diff --git a/http/http.go b/http/http.go index b3c3f96b..95747794 100644 --- a/http/http.go +++ b/http/http.go @@ -51,7 +51,7 @@ func NewHandler(imgSvc ImgService, fileCache FileCache, store *storage.Storage, api.PathPrefix("/resources").Handler(monkey(resourcePostPutHandler, "/api/resources")).Methods("PUT") api.PathPrefix("/resources").Handler(monkey(resourcePatchHandler, "/api/resources")).Methods("PATCH") - api.Path("/shares").Handler(monkey(shareListHandler, "")).Methods("GET") + api.Path("/shares").Handler(monkey(shareListHandler, "/api/shares")).Methods("GET") api.PathPrefix("/share").Handler(monkey(shareGetsHandler, "/api/share")).Methods("GET") api.PathPrefix("/share").Handler(monkey(sharePostHandler, "/api/share")).Methods("POST") api.PathPrefix("/share").Handler(monkey(shareDeleteHandler, "/api/share")).Methods("DELETE") diff --git a/http/share.go b/http/share.go index d2b4637f..853a178e 100644 --- a/http/share.go +++ b/http/share.go @@ -25,11 +25,15 @@ func withPermShare(fn handleFunc) handleFunc { } var shareListHandler = withPermShare(func(w http.ResponseWriter, r *http.Request, d *data) (int, error) { - id := d.user.ID + var ( + s []*share.Link + err error + ) if d.user.Perm.Admin { - id = 0 + s, err = d.store.Share.All() + } else { + s, err = d.store.Share.FindByUserID(d.user.ID) } - s, err := d.store.Share.List(id) if err == errors.ErrNotExist { return renderJSON(w, r, []*share.Link{}) } diff --git a/share/storage.go b/share/storage.go index cf6eea7c..4cd263de 100644 --- a/share/storage.go +++ b/share/storage.go @@ -8,7 +8,8 @@ import ( // StorageBackend is the interface to implement for a share storage. type StorageBackend interface { - List(id uint) ([]*Link, error) + All() ([]*Link, error) + FindByUserID(id uint) ([]*Link, error) GetByHash(hash string) (*Link, error) GetPermanent(path string, id uint) (*Link, error) Gets(path string, id uint) ([]*Link, error) @@ -26,9 +27,29 @@ func NewStorage(back StorageBackend) *Storage { return &Storage{back: back} } -// List wraps a StorageBackend.List. -func (s *Storage) List(id uint) ([]*Link, error) { - links, err := s.back.List(id) +// All wraps a StorageBackend.All. +func (s *Storage) All() ([]*Link, error) { + links, err := s.back.All() + + if err != nil { + return nil, err + } + + for i, link := range links { + if link.Expire != 0 && link.Expire <= time.Now().Unix() { + if err := s.Delete(link.Hash); err != nil { + return nil, err + } + links = append(links[:i], links[i+1:]...) + } + } + + return links, nil +} + +// FindByUserID wraps a StorageBackend.FindByUserID. +func (s *Storage) FindByUserID(id uint) ([]*Link, error) { + links, err := s.back.FindByUserID(id) if err != nil { return nil, err diff --git a/storage/bolt/share.go b/storage/bolt/share.go index 6c6725f5..78940c34 100644 --- a/storage/bolt/share.go +++ b/storage/bolt/share.go @@ -12,16 +12,19 @@ type shareBackend struct { db *storm.DB } -func (s shareBackend) List(id uint) ([]*share.Link, error) { - var ( - v []*share.Link - err error - ) - if id == 0 { - err = s.db.All(&v) - } else { - err = s.db.Select(q.Eq("UserID", id)).Find(&v) +func (s shareBackend) All() ([]*share.Link, error) { + var v []*share.Link + err := s.db.All(&v) + if err == storm.ErrNotFound { + return v, errors.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 err == storm.ErrNotFound { return v, errors.ErrNotExist }