From 450f64605eb5b6d63ab66f71542cedb077d260b5 Mon Sep 17 00:00:00 2001 From: nkanaev Date: Mon, 11 May 2026 09:59:21 +0100 Subject: [PATCH] refactor feed updating --- src/server/routes.go | 15 ++++++----- src/server/routes_test.go | 2 +- src/storage/feed.go | 53 ++++++++++++++++++++------------------- src/storage/feed_test.go | 11 +++++--- src/worker/worker.go | 2 +- 5 files changed, 46 insertions(+), 37 deletions(-) diff --git a/src/server/routes.go b/src/server/routes.go index b563768..9f4b7c0 100644 --- a/src/server/routes.go +++ b/src/server/routes.go @@ -284,24 +284,27 @@ func (s *Server) handleFeed(c *router.Context) { c.Out.WriteHeader(http.StatusBadRequest) return } + params := storage.UpdateFeedParams{} if title, ok := body["title"]; ok { if reflect.TypeOf(title).Kind() == reflect.String { - s.db.RenameFeed(id, title.(string)) + t := title.(string) + params.Title = &t } } if f_id, ok := body["folder_id"]; ok { - if f_id == nil { - s.db.UpdateFeedFolder(id, nil) - } else if reflect.TypeOf(f_id).Kind() == reflect.Float64 { + params.UpdateFolderID = true + if reflect.TypeOf(f_id).Kind() == reflect.Float64 { folderId := int64(f_id.(float64)) - s.db.UpdateFeedFolder(id, &folderId) + params.FolderID = &folderId } } if link, ok := body["feed_link"]; ok { if reflect.TypeOf(link).Kind() == reflect.String { - s.db.UpdateFeedLink(id, link.(string)) + l := link.(string) + params.FeedLink = &l } } + s.db.UpdateFeed(id, params) c.Out.WriteHeader(http.StatusOK) } else if c.Req.Method == "DELETE" { s.db.DeleteFeed(id) diff --git a/src/server/routes_test.go b/src/server/routes_test.go index cb53bb7..ce2a5dc 100644 --- a/src/server/routes_test.go +++ b/src/server/routes_test.go @@ -80,7 +80,7 @@ func TestFeedIcons(t *testing.T) { db, _ := storage.New(":memory:") icon := []byte("test") feed := db.CreateFeed("", "", "", "", nil) - db.UpdateFeedIcon(feed.Id, &icon) + db.UpdateFeed(feed.Id, storage.UpdateFeedParams{Icon: &icon, UpdateIcon: true}) log.SetOutput(os.Stderr) recorder := httptest.NewRecorder() diff --git a/src/storage/feed.go b/src/storage/feed.go index 0988b37..e1f555c 100644 --- a/src/storage/feed.go +++ b/src/storage/feed.go @@ -64,36 +64,37 @@ func (s *Storage) DeleteFeed(feedId int64) bool { return nrows == 1 } -func (s *Storage) RenameFeed(feedId int64, newTitle string) bool { - _, err := s.db.Exec(`update feeds set title = :title where id = :id`, - sql.Named("title", newTitle), - sql.Named("id", feedId), - ) - return err == nil +type UpdateFeedParams struct { + Title *string + FeedLink *string + FolderID *int64 + UpdateFolderID bool + Icon *[]byte + UpdateIcon bool } -func (s *Storage) UpdateFeedFolder(feedId int64, newFolderId *int64) bool { - _, err := s.db.Exec(`update feeds set folder_id = :folder_id where id = :id`, - sql.Named("folder_id", newFolderId), +func (s *Storage) UpdateFeed(feedId int64, params UpdateFeedParams) (bool, error) { + _, err := s.db.Exec(` + update feeds set + title = coalesce(:title, title), + feed_link = coalesce(:feed_link, feed_link), + folder_id = case when :update_folder_id then :folder_id else folder_id end, + icon = case when :update_icon then :icon else icon end + where id = :id + `, sql.Named("id", feedId), + sql.Named("title", params.Title), + sql.Named("feed_link", params.FeedLink), + sql.Named("update_folder_id", params.UpdateFolderID), + sql.Named("folder_id", params.FolderID), + sql.Named("update_icon", params.UpdateIcon), + sql.Named("icon", params.Icon), ) - return err == nil -} - -func (s *Storage) UpdateFeedLink(feedId int64, newLink string) bool { - _, err := s.db.Exec(`update feeds set feed_link = :feed_link where id = :id`, - sql.Named("feed_link", newLink), - sql.Named("id", feedId), - ) - return err == nil -} - -func (s *Storage) UpdateFeedIcon(feedId int64, icon *[]byte) bool { - _, err := s.db.Exec(`update feeds set icon = :icon where id = :id`, - sql.Named("icon", icon), - sql.Named("id", feedId), - ) - return err == nil + if err != nil { + log.Print(err) + return false, err + } + return true, nil } func (s *Storage) ListFeeds() []Feed { diff --git a/src/storage/feed_test.go b/src/storage/feed_test.go index 27a16fd..2e101e9 100644 --- a/src/storage/feed_test.go +++ b/src/storage/feed_test.go @@ -54,9 +54,14 @@ func TestUpdateFeed(t *testing.T) { folder := db.CreateFolder("test") icon := []byte("icon") - db.RenameFeed(feed1.Id, "newtitle") - db.UpdateFeedFolder(feed1.Id, &folder.Id) - db.UpdateFeedIcon(feed1.Id, &icon) + title := "newtitle" + db.UpdateFeed(feed1.Id, UpdateFeedParams{ + Title: &title, + FolderID: &folder.Id, + UpdateFolderID: true, + Icon: &icon, + UpdateIcon: true, + }) feed2 := db.GetFeed(feed1.Id) if feed2.Title != "newtitle" { diff --git a/src/worker/worker.go b/src/worker/worker.go index 5302572..18a8d07 100644 --- a/src/worker/worker.go +++ b/src/worker/worker.go @@ -53,7 +53,7 @@ func (w *Worker) FindFeedFavicon(feed storage.Feed) { log.Printf("Failed to find favicon for %s (%s): %s", feed.FeedLink, feed.Link, err) } if icon != nil { - w.db.UpdateFeedIcon(feed.Id, icon) + w.db.UpdateFeed(feed.Id, storage.UpdateFeedParams{Icon: icon, UpdateIcon: true}) } }