diff --git a/reader/feed/handler.go b/reader/feed/handler.go index 6c039ff6..e1bedaab 100644 --- a/reader/feed/handler.go +++ b/reader/feed/handler.go @@ -127,6 +127,13 @@ func (h *Handler) RefreshFeed(userID, feedID int64) error { return requestErr } + if h.store.AnotherFeedURLExists(userID, originalFeed.ID, response.EffectiveURL) { + storeErr := errors.NewLocalizedError(errDuplicate, response.EffectiveURL) + originalFeed.WithError(storeErr.Error()) + h.store.UpdateFeedError(originalFeed) + return storeErr + } + if originalFeed.IgnoreHTTPCache || response.IsModified(originalFeed.EtagHeader, originalFeed.LastModifiedHeader) { logger.Debug("[Handler:RefreshFeed] Feed #%d has been modified", feedID) diff --git a/storage/feed.go b/storage/feed.go index 508288ac..55ce6e83 100644 --- a/storage/feed.go +++ b/storage/feed.go @@ -68,6 +68,14 @@ func (s *Storage) FeedURLExists(userID int64, feedURL string) bool { return result } +// AnotherFeedURLExists checks if the user a duplicated feed. +func (s *Storage) AnotherFeedURLExists(userID, feedID int64, feedURL string) bool { + var result bool + query := `SELECT true FROM feeds WHERE id <> $1 AND user_id=$2 AND feed_url=$3` + s.db.QueryRow(query, feedID, userID, feedURL).Scan(&result) + return result +} + // CountFeeds returns the number of feeds that belongs to the given user. func (s *Storage) CountFeeds(userID int64) int { var result int