1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-09-15 18:57:04 +00:00
This commit is contained in:
Julien Voisin 2025-09-11 20:19:35 +01:00 committed by GitHub
commit 2c3710a96d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 32 additions and 24 deletions

View file

@ -2932,3 +2932,32 @@ func TestFlushHistoryEndpoint(t *testing.T) {
t.Fatalf(`Invalid total, got %d`, readEntries.Total) t.Fatalf(`Invalid total, got %d`, readEntries.Total)
} }
} }
func TestRemoveFeedAsRegularUser(t *testing.T) {
testConfig := newIntegrationTestConfig()
if !testConfig.isConfigured() {
t.Skip(skipIntegrationTestsMessage)
}
adminClient := miniflux.NewClient(testConfig.testBaseURL, testConfig.testAdminUsername, testConfig.testAdminPassword)
regularTestUser, err := adminClient.CreateUser(testConfig.genRandomUsername(), testConfig.testRegularPassword, false)
if err != nil {
t.Fatal(err)
}
defer adminClient.DeleteUser(regularTestUser.ID)
regularUserClient := miniflux.NewClient(testConfig.testBaseURL, regularTestUser.Username, testConfig.testRegularPassword)
feedID, err := regularUserClient.CreateFeed(&miniflux.FeedCreationRequest{
FeedURL: testConfig.testFeedURL,
})
if err != nil {
t.Fatal(err)
}
if err := regularUserClient.DeleteFeed(feedID); err != nil {
t.Fatal(err)
}
if _, err := regularUserClient.Feed(feedID); err == nil {
t.Errorf(`Got a feed (%d) even though it was deleted, was expecting an error instead.`, feedID)
}
}

View file

@ -7,7 +7,6 @@ import (
"database/sql" "database/sql"
"errors" "errors"
"fmt" "fmt"
"log/slog"
"sort" "sort"
"time" "time"
@ -470,29 +469,9 @@ func (s *Storage) UpdateFeedError(feed *model.Feed) (err error) {
// RemoveFeed removes a feed and all entries. // RemoveFeed removes a feed and all entries.
// This operation can takes time if the feed has lot of entries. // This operation can takes time if the feed has lot of entries.
func (s *Storage) RemoveFeed(userID, feedID int64) error { func (s *Storage) RemoveFeed(userID, feedID int64) error {
rows, err := s.db.Query(`SELECT id FROM entries WHERE user_id=$1 AND feed_id=$2`, userID, feedID) // Since entries have a `references` on `feeds(id)` with an `on delete cascade`,
if err != nil { // we can simply remove the correct `feeds(id)` and postgresql will take care of deleting the
return fmt.Errorf(`store: unable to get user feed entries: %v`, err) // corresponding entries.
}
defer rows.Close()
for rows.Next() {
var entryID int64
if err := rows.Scan(&entryID); err != nil {
return fmt.Errorf(`store: unable to read user feed entry ID: %v`, err)
}
slog.Debug("Deleting entry",
slog.Int64("user_id", userID),
slog.Int64("feed_id", feedID),
slog.Int64("entry_id", entryID),
)
if _, err := s.db.Exec(`DELETE FROM entries WHERE id=$1 AND user_id=$2`, entryID, userID); err != nil {
return fmt.Errorf(`store: unable to delete user feed entries #%d: %v`, entryID, err)
}
}
if _, err := s.db.Exec(`DELETE FROM feeds WHERE id=$1 AND user_id=$2`, feedID, userID); err != nil { if _, err := s.db.Exec(`DELETE FROM feeds WHERE id=$1 AND user_id=$2`, feedID, userID); err != nil {
return fmt.Errorf(`store: unable to delete feed #%d: %v`, feedID, err) return fmt.Errorf(`store: unable to delete feed #%d: %v`, feedID, err)
} }