From 59af8aa62d505495b3204d61ca3112cb5b9bbab0 Mon Sep 17 00:00:00 2001 From: nkanaev Date: Mon, 11 May 2026 11:03:41 +0100 Subject: [PATCH] use CreateFeedParams for CreateFeed --- src/server/routes.go | 26 +++++++++++++++++--------- src/server/routes_test.go | 2 +- src/storage/feed.go | 29 +++++++++++++++++++---------- src/storage/feed_test.go | 16 ++++++++-------- src/storage/item_test.go | 16 ++++++++-------- 5 files changed, 53 insertions(+), 36 deletions(-) diff --git a/src/server/routes.go b/src/server/routes.go index f78feb8..9cdef97 100644 --- a/src/server/routes.go +++ b/src/server/routes.go @@ -242,13 +242,12 @@ func (s *Server) handleFeedList(c *router.Context) { map[string]any{"status": "multiple", "choice": result.Sources}, ) case result.Feed != nil: - feed := s.db.CreateFeed( - result.Feed.Title, - "", - result.Feed.SiteURL, - result.FeedLink, - form.FolderID, - ) + feed := s.db.CreateFeed(storage.CreateFeedParams{ + Title: result.Feed.Title, + Link: result.Feed.SiteURL, + FeedLink: result.FeedLink, + FolderID: form.FolderID, + }) items := worker.ConvertItems(result.Feed.Items, *feed) if len(items) > 0 { s.db.CreateItems(items) @@ -448,12 +447,21 @@ func (s *Server) handleOPMLImport(c *router.Context) { return } for _, f := range doc.Feeds { - s.db.CreateFeed(f.Title, "", f.SiteUrl, f.FeedUrl, nil) + s.db.CreateFeed(storage.CreateFeedParams{ + Title: f.Title, + Link: f.SiteUrl, + FeedLink: f.FeedUrl, + }) } for _, f := range doc.Folders { folder := s.db.CreateFolder(f.Title) for _, ff := range f.AllFeeds() { - s.db.CreateFeed(ff.Title, "", ff.SiteUrl, ff.FeedUrl, &folder.Id) + s.db.CreateFeed(storage.CreateFeedParams{ + Title: ff.Title, + Link: ff.SiteUrl, + FeedLink: ff.FeedUrl, + FolderID: &folder.Id, + }) } } diff --git a/src/server/routes_test.go b/src/server/routes_test.go index 61cdeee..03e6881 100644 --- a/src/server/routes_test.go +++ b/src/server/routes_test.go @@ -79,7 +79,7 @@ func TestFeedIcons(t *testing.T) { log.SetOutput(io.Discard) db, _ := storage.New(":memory:") icon := []byte("test") - feed := db.CreateFeed("", "", "", "", nil) + feed := db.CreateFeed(storage.CreateFeedParams{}) db.UpdateFeed(feed.Id, storage.UpdateFeedParams{Icon: storage.SetNullable(&icon)}) log.SetOutput(os.Stderr) diff --git a/src/storage/feed.go b/src/storage/feed.go index e086399..daeef65 100644 --- a/src/storage/feed.go +++ b/src/storage/feed.go @@ -16,9 +16,18 @@ type Feed struct { HasIcon bool `json:"has_icon"` } -func (s *Storage) CreateFeed(title, description, link, feedLink string, folderId *int64) *Feed { +type CreateFeedParams struct { + Title string + Description string + Link string + FeedLink string + FolderID *int64 +} + +func (s *Storage) CreateFeed(params CreateFeedParams) *Feed { + title := params.Title if title == "" { - title = feedLink + title = params.FeedLink } row := s.db.QueryRow(` insert into feeds (title, description, link, feed_link, folder_id) @@ -26,10 +35,10 @@ func (s *Storage) CreateFeed(title, description, link, feedLink string, folderId on conflict (feed_link) do update set folder_id = :folder_id returning id`, sql.Named("title", title), - sql.Named("description", description), - sql.Named("link", link), - sql.Named("feed_link", feedLink), - sql.Named("folder_id", folderId), + sql.Named("description", params.Description), + sql.Named("link", params.Link), + sql.Named("feed_link", params.FeedLink), + sql.Named("folder_id", params.FolderID), ) var id int64 @@ -41,10 +50,10 @@ func (s *Storage) CreateFeed(title, description, link, feedLink string, folderId return &Feed{ Id: id, Title: title, - Description: description, - Link: link, - FeedLink: feedLink, - FolderId: folderId, + Description: params.Description, + Link: params.Link, + FeedLink: params.FeedLink, + FolderId: params.FolderID, } } diff --git a/src/storage/feed_test.go b/src/storage/feed_test.go index dbb46ff..aad0ab5 100644 --- a/src/storage/feed_test.go +++ b/src/storage/feed_test.go @@ -7,7 +7,7 @@ import ( func TestCreateFeed(t *testing.T) { db := testDB() - feed1 := db.CreateFeed("title", "", "http://example.com", "http://example.com/feed.xml", nil) + feed1 := db.CreateFeed(CreateFeedParams{Title: "title", Link: "http://example.com", FeedLink: "http://example.com/feed.xml"}) if feed1 == nil || feed1.Id == 0 { t.Fatal("expected feed") } @@ -19,16 +19,16 @@ func TestCreateFeed(t *testing.T) { func TestCreateFeedSameLink(t *testing.T) { db := testDB() - feed1 := db.CreateFeed("title", "", "", "http://example1.com/feed.xml", nil) + feed1 := db.CreateFeed(CreateFeedParams{Title: "title", FeedLink: "http://example1.com/feed.xml"}) if feed1 == nil || feed1.Id == 0 { t.Fatal("expected feed") } for range 10 { - db.CreateFeed("title", "", "", "http://example2.com/feed.xml", nil) + db.CreateFeed(CreateFeedParams{Title: "title", FeedLink: "http://example2.com/feed.xml"}) } - feed2 := db.CreateFeed("title", "", "http://example.com", "http://example1.com/feed.xml", nil) + feed2 := db.CreateFeed(CreateFeedParams{Title: "title", Link: "http://example.com", FeedLink: "http://example1.com/feed.xml"}) if feed1.Id != feed2.Id { t.Fatalf("expected the same feed.\nwant: %#v\nhave: %#v", feed1, feed2) } @@ -40,8 +40,8 @@ func TestReadFeed(t *testing.T) { t.Fatal("cannot get nonexistent feed") } - feed1 := db.CreateFeed("feed 1", "", "http://example1.com", "http://example1.com/feed.xml", nil) - feed2 := db.CreateFeed("feed 2", "", "http://example2.com", "http://example2.com/feed.xml", nil) + feed1 := db.CreateFeed(CreateFeedParams{Title: "feed 1", Link: "http://example1.com", FeedLink: "http://example1.com/feed.xml"}) + feed2 := db.CreateFeed(CreateFeedParams{Title: "feed 2", Link: "http://example2.com", FeedLink: "http://example2.com/feed.xml"}) feeds := db.ListFeeds() if !reflect.DeepEqual(feeds, []Feed{*feed1, *feed2}) { t.Fatalf("invalid feed list: %#v", feeds) @@ -50,7 +50,7 @@ func TestReadFeed(t *testing.T) { func TestUpdateFeed(t *testing.T) { db := testDB() - feed1 := db.CreateFeed("feed 1", "", "http://example1.com", "http://example1.com/feed.xml", nil) + feed1 := db.CreateFeed(CreateFeedParams{Title: "feed 1", Link: "http://example1.com", FeedLink: "http://example1.com/feed.xml"}) folder := db.CreateFolder("test") icon := []byte("icon") @@ -75,7 +75,7 @@ func TestUpdateFeed(t *testing.T) { func TestDeleteFeed(t *testing.T) { db := testDB() - feed1 := db.CreateFeed("title", "", "http://example.com", "http://example.com/feed.xml", nil) + feed1 := db.CreateFeed(CreateFeedParams{Title: "title", Link: "http://example.com", FeedLink: "http://example.com/feed.xml"}) if db.DeleteFeed(100500) { t.Error("cannot delete what does not exist") diff --git a/src/storage/item_test.go b/src/storage/item_test.go index 3f3b8b7..7d76c20 100644 --- a/src/storage/item_test.go +++ b/src/storage/item_test.go @@ -39,10 +39,10 @@ func testItemsSetup(db *Storage) testItemScope { folder1 := db.CreateFolder("folder1") folder2 := db.CreateFolder("folder2") - feed11 := db.CreateFeed("feed11", "", "", "http://test.com/feed11.xml", &folder1.Id) - feed12 := db.CreateFeed("feed12", "", "", "http://test.com/feed12.xml", &folder1.Id) - feed21 := db.CreateFeed("feed21", "", "", "http://test.com/feed21.xml", &folder2.Id) - feed01 := db.CreateFeed("feed01", "", "", "http://test.com/feed01.xml", nil) + feed11 := db.CreateFeed(CreateFeedParams{Title: "feed11", FeedLink: "http://test.com/feed11.xml", FolderID: &folder1.Id}) + feed12 := db.CreateFeed(CreateFeedParams{Title: "feed12", FeedLink: "http://test.com/feed12.xml", FolderID: &folder1.Id}) + feed21 := db.CreateFeed(CreateFeedParams{Title: "feed21", FeedLink: "http://test.com/feed21.xml", FolderID: &folder2.Id}) + feed01 := db.CreateFeed(CreateFeedParams{Title: "feed01", FeedLink: "http://test.com/feed01.xml"}) now := time.Now() db.CreateItems([]Item{ @@ -326,7 +326,7 @@ func TestDeleteOldItems(t *testing.T) { t.Run("keeps at least 50 items", func(t *testing.T) { db := testDB() - feed := db.CreateFeed("f", "", "", "http://f.xml", nil) + feed := db.CreateFeed(CreateFeedParams{Title: "f", FeedLink: "http://f.xml"}) items := make([]Item, 100) for i := range 100 { items[i] = Item{GUID: strconv.Itoa(i), FeedId: feed.Id, Date: now.Add(time.Duration(i) * time.Hour * 24)} @@ -347,7 +347,7 @@ func TestDeleteOldItems(t *testing.T) { t.Run("keeps all less than 90 days old", func(t *testing.T) { db := testDB() - feed := db.CreateFeed("f", "", "", "http://f.xml", nil) + feed := db.CreateFeed(CreateFeedParams{Title: "f", FeedLink: "http://f.xml"}) items := make([]Item, 100) for i := 0; i < 100; i++ { items[i] = Item{GUID: strconv.Itoa(i), FeedId: feed.Id, Date: now.Add(time.Duration(i) * time.Second)} @@ -369,7 +369,7 @@ func TestDeleteOldItems(t *testing.T) { t.Run("keeps starred", func(t *testing.T) { db := testDB() - feed := db.CreateFeed("f", "", "", "http://f.xml", nil) + feed := db.CreateFeed(CreateFeedParams{Title: "f", FeedLink: "http://f.xml"}) items := make([]Item, 100) for i := 0; i < 100; i++ { items[i] = Item{GUID: strconv.Itoa(i), FeedId: feed.Id, Date: now.Add(time.Duration(i) * time.Second)} @@ -398,7 +398,7 @@ func TestCreateItemsLastArrived(t *testing.T) { synctest.Test(t, func(t *testing.T) { db := testDB() defer db.db.Close() - feed := db.CreateFeed("test feed", "", "", "http://example.com/feed", nil) + feed := db.CreateFeed(CreateFeedParams{Title: "test feed", FeedLink: "http://example.com/feed"}) item := Item{ GUID: "item1",