use CreateFeedParams for CreateFeed

This commit is contained in:
nkanaev
2026-05-11 11:03:41 +01:00
parent 31274d17a5
commit 59af8aa62d
5 changed files with 53 additions and 36 deletions

View File

@@ -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,
})
}
}

View File

@@ -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)

View File

@@ -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,
}
}

View File

@@ -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")

View File

@@ -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",