use nullable for field updates

This commit is contained in:
nkanaev
2026-05-11 10:27:50 +01:00
parent 450f64605e
commit 31274d17a5
6 changed files with 28 additions and 22 deletions

View File

@@ -292,10 +292,11 @@ func (s *Server) handleFeed(c *router.Context) {
} }
} }
if f_id, ok := body["folder_id"]; ok { if f_id, ok := body["folder_id"]; ok {
params.UpdateFolderID = true if f_id == nil {
if reflect.TypeOf(f_id).Kind() == reflect.Float64 { params.FolderID = storage.SetNullable[int64](nil)
} else if reflect.TypeOf(f_id).Kind() == reflect.Float64 {
folderId := int64(f_id.(float64)) folderId := int64(f_id.(float64))
params.FolderID = &folderId params.FolderID = storage.SetNullable(&folderId)
} }
} }
if link, ok := body["feed_link"]; ok { if link, ok := body["feed_link"]; ok {

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.UpdateFeed(feed.Id, storage.UpdateFeedParams{Icon: &icon, UpdateIcon: true}) db.UpdateFeed(feed.Id, storage.UpdateFeedParams{Icon: storage.SetNullable(&icon)})
log.SetOutput(os.Stderr) log.SetOutput(os.Stderr)
recorder := httptest.NewRecorder() recorder := httptest.NewRecorder()

View File

@@ -67,10 +67,8 @@ func (s *Storage) DeleteFeed(feedId int64) bool {
type UpdateFeedParams struct { type UpdateFeedParams struct {
Title *string Title *string
FeedLink *string FeedLink *string
FolderID *int64 FolderID Nullable[int64]
UpdateFolderID bool Icon Nullable[[]byte]
Icon *[]byte
UpdateIcon bool
} }
func (s *Storage) UpdateFeed(feedId int64, params UpdateFeedParams) (bool, error) { func (s *Storage) UpdateFeed(feedId int64, params UpdateFeedParams) (bool, error) {
@@ -85,10 +83,10 @@ func (s *Storage) UpdateFeed(feedId int64, params UpdateFeedParams) (bool, error
sql.Named("id", feedId), sql.Named("id", feedId),
sql.Named("title", params.Title), sql.Named("title", params.Title),
sql.Named("feed_link", params.FeedLink), sql.Named("feed_link", params.FeedLink),
sql.Named("update_folder_id", params.UpdateFolderID), sql.Named("update_folder_id", params.FolderID.Set),
sql.Named("folder_id", params.FolderID), sql.Named("folder_id", params.FolderID.Value),
sql.Named("update_icon", params.UpdateIcon), sql.Named("update_icon", params.Icon.Set),
sql.Named("icon", params.Icon), sql.Named("icon", params.Icon.Value),
) )
if err != nil { if err != nil {
log.Print(err) log.Print(err)

View File

@@ -57,10 +57,8 @@ func TestUpdateFeed(t *testing.T) {
title := "newtitle" title := "newtitle"
db.UpdateFeed(feed1.Id, UpdateFeedParams{ db.UpdateFeed(feed1.Id, UpdateFeedParams{
Title: &title, Title: &title,
FolderID: &folder.Id, FolderID: SetNullable(&folder.Id),
UpdateFolderID: true, Icon: SetNullable(&icon),
Icon: &icon,
UpdateIcon: true,
}) })
feed2 := db.GetFeed(feed1.Id) feed2 := db.GetFeed(feed1.Id)

View File

@@ -12,6 +12,15 @@ type Storage struct {
db *sql.DB db *sql.DB
} }
type Nullable[T any] struct {
Set bool
Value *T
}
func SetNullable[T any](v *T) Nullable[T] {
return Nullable[T]{Set: true, Value: v}
}
func New(path string) (*Storage, error) { func New(path string) (*Storage, error) {
if pos := strings.IndexRune(path, '?'); pos == -1 { if pos := strings.IndexRune(path, '?'); pos == -1 {
params := "_journal=WAL&_sync=NORMAL&_busy_timeout=5000&cache=shared" params := "_journal=WAL&_sync=NORMAL&_busy_timeout=5000&cache=shared"

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.UpdateFeed(feed.Id, storage.UpdateFeedParams{Icon: icon, UpdateIcon: true}) w.db.UpdateFeed(feed.Id, storage.UpdateFeedParams{Icon: storage.SetNullable(icon)})
} }
} }