diff --git a/storage/entry.go b/storage/entry.go index 7bc1f869..5dfb801d 100644 --- a/storage/entry.go +++ b/storage/entry.go @@ -7,6 +7,7 @@ package storage import ( "errors" "fmt" + "log" "time" "github.com/miniflux/miniflux2/helper" @@ -100,6 +101,7 @@ func (s *Storage) EntryExists(entry *model.Entry) bool { // UpdateEntries update a list of entries while refreshing a feed. func (s *Storage) UpdateEntries(userID, feedID int64, entries model.Entries) (err error) { + var entryHashes []string for _, entry := range entries { entry.UserID = userID entry.FeedID = feedID @@ -113,6 +115,26 @@ func (s *Storage) UpdateEntries(userID, feedID int64, entries model.Entries) (er if err != nil { return err } + + entryHashes = append(entryHashes, entry.Hash) + } + + if err := s.CleanupEntries(feedID, entryHashes); err != nil { + log.Println(err) + } + + return nil +} + +// CleanupEntries deletes from the database entries marked as "removed" and not visible anymore in the feed. +func (s *Storage) CleanupEntries(feedID int64, entryHashes []string) error { + query := ` + DELETE FROM entries + WHERE feed_id=$1 AND + id IN (SELECT id FROM entries WHERE feed_id=$2 AND status=$3 AND NOT (hash=ANY($4))) + ` + if _, err := s.db.Exec(query, feedID, feedID, model.EntryStatusRemoved, pq.Array(entryHashes)); err != nil { + return fmt.Errorf("unable to cleanup entries: %v", err) } return nil