refactor feed updating

This commit is contained in:
nkanaev
2026-05-11 09:59:21 +01:00
parent 391e2dd2c8
commit 450f64605e
5 changed files with 46 additions and 37 deletions

View File

@@ -284,24 +284,27 @@ func (s *Server) handleFeed(c *router.Context) {
c.Out.WriteHeader(http.StatusBadRequest) c.Out.WriteHeader(http.StatusBadRequest)
return return
} }
params := storage.UpdateFeedParams{}
if title, ok := body["title"]; ok { if title, ok := body["title"]; ok {
if reflect.TypeOf(title).Kind() == reflect.String { 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, ok := body["folder_id"]; ok {
if f_id == nil { params.UpdateFolderID = true
s.db.UpdateFeedFolder(id, nil) if reflect.TypeOf(f_id).Kind() == reflect.Float64 {
} else if reflect.TypeOf(f_id).Kind() == reflect.Float64 {
folderId := int64(f_id.(float64)) folderId := int64(f_id.(float64))
s.db.UpdateFeedFolder(id, &folderId) params.FolderID = &folderId
} }
} }
if link, ok := body["feed_link"]; ok { if link, ok := body["feed_link"]; ok {
if reflect.TypeOf(link).Kind() == reflect.String { 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) c.Out.WriteHeader(http.StatusOK)
} else if c.Req.Method == "DELETE" { } else if c.Req.Method == "DELETE" {
s.db.DeleteFeed(id) s.db.DeleteFeed(id)

View File

@@ -80,7 +80,7 @@ func TestFeedIcons(t *testing.T) {
db, _ := storage.New(":memory:") db, _ := storage.New(":memory:")
icon := []byte("test") icon := []byte("test")
feed := db.CreateFeed("", "", "", "", nil) feed := db.CreateFeed("", "", "", "", nil)
db.UpdateFeedIcon(feed.Id, &icon) db.UpdateFeed(feed.Id, storage.UpdateFeedParams{Icon: &icon, UpdateIcon: true})
log.SetOutput(os.Stderr) log.SetOutput(os.Stderr)
recorder := httptest.NewRecorder() recorder := httptest.NewRecorder()

View File

@@ -64,36 +64,37 @@ func (s *Storage) DeleteFeed(feedId int64) bool {
return nrows == 1 return nrows == 1
} }
func (s *Storage) RenameFeed(feedId int64, newTitle string) bool { type UpdateFeedParams struct {
_, err := s.db.Exec(`update feeds set title = :title where id = :id`, Title *string
sql.Named("title", newTitle), FeedLink *string
sql.Named("id", feedId), FolderID *int64
) UpdateFolderID bool
return err == nil Icon *[]byte
UpdateIcon bool
} }
func (s *Storage) UpdateFeedFolder(feedId int64, newFolderId *int64) bool { func (s *Storage) UpdateFeed(feedId int64, params UpdateFeedParams) (bool, error) {
_, err := s.db.Exec(`update feeds set folder_id = :folder_id where id = :id`, _, err := s.db.Exec(`
sql.Named("folder_id", newFolderId), 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("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 if err != nil {
} log.Print(err)
return false, err
func (s *Storage) UpdateFeedLink(feedId int64, newLink string) bool { }
_, err := s.db.Exec(`update feeds set feed_link = :feed_link where id = :id`, return true, nil
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
} }
func (s *Storage) ListFeeds() []Feed { func (s *Storage) ListFeeds() []Feed {

View File

@@ -54,9 +54,14 @@ func TestUpdateFeed(t *testing.T) {
folder := db.CreateFolder("test") folder := db.CreateFolder("test")
icon := []byte("icon") icon := []byte("icon")
db.RenameFeed(feed1.Id, "newtitle") title := "newtitle"
db.UpdateFeedFolder(feed1.Id, &folder.Id) db.UpdateFeed(feed1.Id, UpdateFeedParams{
db.UpdateFeedIcon(feed1.Id, &icon) Title: &title,
FolderID: &folder.Id,
UpdateFolderID: true,
Icon: &icon,
UpdateIcon: true,
})
feed2 := db.GetFeed(feed1.Id) feed2 := db.GetFeed(feed1.Id)
if feed2.Title != "newtitle" { if feed2.Title != "newtitle" {

View File

@@ -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) log.Printf("Failed to find favicon for %s (%s): %s", feed.FeedLink, feed.Link, err)
} }
if icon != nil { if icon != nil {
w.db.UpdateFeedIcon(feed.Id, icon) w.db.UpdateFeed(feed.Id, storage.UpdateFeedParams{Icon: icon, UpdateIcon: true})
} }
} }