From 1d78371e13c19488d472257ab614e0be17bfa85e Mon Sep 17 00:00:00 2001 From: nsfisis Date: Sun, 1 Feb 2026 10:05:13 +0900 Subject: refactor: extract feed fetch and sync logic into shared feed package Consolidate duplicated feed fetching and article syncing code from AddFeed resolver and fetchOneFeed into reusable feed.Fetch and feed.Sync functions. This unifies behavior (10s timeout, article updates) across both call sites. Co-Authored-By: Claude Opus 4.5 --- backend/cmd/serve.go | 62 +++------------------------------------------------- 1 file changed, 3 insertions(+), 59 deletions(-) (limited to 'backend/cmd') diff --git a/backend/cmd/serve.go b/backend/cmd/serve.go index 30d0702..e2d2df5 100644 --- a/backend/cmd/serve.go +++ b/backend/cmd/serve.go @@ -4,7 +4,6 @@ import ( "context" "database/sql" "embed" - "fmt" "log" "net/http" "os" @@ -20,78 +19,23 @@ import ( "github.com/labstack/echo-contrib/session" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" - "github.com/mmcdole/gofeed" "github.com/vektah/gqlparser/v2/ast" "undef.ninja/x/feedaka/auth" "undef.ninja/x/feedaka/config" "undef.ninja/x/feedaka/db" + "undef.ninja/x/feedaka/feed" "undef.ninja/x/feedaka/graphql" "undef.ninja/x/feedaka/graphql/resolver" ) func fetchOneFeed(feedID int64, url string, ctx context.Context, queries *db.Queries) error { log.Printf("Fetching %s...\n", url) - fp := gofeed.NewParser() - ctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - feed, err := fp.ParseURLWithContext(url, ctx) - if err != nil { - return fmt.Errorf("Failed to fetch %s: %v\n", url, err) - } - err = queries.UpdateFeedMetadata(ctx, db.UpdateFeedMetadataParams{ - Title: feed.Title, - FetchedAt: time.Now().UTC().Format(time.RFC3339), - ID: feedID, - }) - if err != nil { - return err - } - // Get GUIDs for this feed (for updating existing articles) - guids, err := queries.GetArticleGUIDsByFeed(ctx, feedID) + f, err := feed.Fetch(ctx, url) if err != nil { return err } - existingFeedGUIDs := make(map[string]bool) - for _, guid := range guids { - existingFeedGUIDs[guid] = true - } - for _, item := range feed.Items { - if existingFeedGUIDs[item.GUID] { - // Article exists in this feed, update it - err := queries.UpdateArticle(ctx, db.UpdateArticleParams{ - Title: item.Title, - Url: item.Link, - FeedID: feedID, - Guid: item.GUID, - }) - if err != nil { - return err - } - } else { - // Check if article with same GUID exists globally (in any feed) - exists, err := queries.CheckArticleExistsByGUID(ctx, item.GUID) - if err != nil { - return err - } - if exists == 1 { - // Article already exists in another feed, skip - continue - } - // Create new article - _, err = queries.CreateArticle(ctx, db.CreateArticleParams{ - FeedID: feedID, - Guid: item.GUID, - Title: item.Title, - Url: item.Link, - IsRead: 0, - }) - if err != nil { - return err - } - } - } - return nil + return feed.Sync(ctx, queries, feedID, f) } func listFeedsToBeFetched(ctx context.Context, queries *db.Queries) (map[int64]string, error) { -- cgit v1.3-1-g0d28