From 8524487824f7332223b24e75ab327bf6ec5eccc9 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 12 Jan 2026 08:58:04 +0000 Subject: refactor: deduplicate articles at insertion time instead of query time Change deduplication strategy from query-time (ROW_NUMBER window function) to insertion-time (global guid check before insert). Benefits: - Simpler queries without CTE/window functions - Consistent read state (no duplicate articles to manage) - Better query performance (no per-query deduplication overhead) Changes: - Add CheckArticleExistsByGUID query for global guid lookup - Add migration to remove existing duplicate articles - Modify fetchOneFeed and AddFeed to skip duplicates on insert - Revert GetUnreadArticles/GetReadArticles to simple queries --- backend/graphql/resolver/schema.resolvers.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'backend/graphql/resolver') diff --git a/backend/graphql/resolver/schema.resolvers.go b/backend/graphql/resolver/schema.resolvers.go index 46c39e7..c3f6f0a 100644 --- a/backend/graphql/resolver/schema.resolvers.go +++ b/backend/graphql/resolver/schema.resolvers.go @@ -43,8 +43,18 @@ func (r *mutationResolver) AddFeed(ctx context.Context, url string) (*model.Feed return nil, fmt.Errorf("failed to insert feed: %w", err) } - // Insert articles from the feed + // Insert articles from the feed (skip duplicates by guid) for _, item := range feed.Items { + // Check if article with same GUID already exists globally + exists, err := r.Queries.CheckArticleExistsByGUID(ctx, item.GUID) + if err != nil { + fmt.Printf("Failed to check article existence: %v\n", err) + continue + } + if exists == 1 { + // Article already exists, skip + continue + } _, err = r.Queries.CreateArticle(ctx, db.CreateArticleParams{ FeedID: dbFeed.ID, Guid: item.GUID, -- cgit v1.2.3-70-g09d2