refactor folder update in storage

This commit is contained in:
nkanaev
2026-05-11 13:36:51 +01:00
parent 59af8aa62d
commit f50894ddb0
3 changed files with 99 additions and 16 deletions

View File

@@ -141,12 +141,10 @@ func (s *Server) handleFolder(c *router.Context) {
c.Out.WriteHeader(http.StatusBadRequest)
return
}
if body.Title != nil {
s.db.RenameFolder(id, *body.Title)
}
if body.IsExpanded != nil {
s.db.ToggleFolderExpanded(id, *body.IsExpanded)
}
s.db.UpdateFolder(id, storage.UpdateFolderParams{
Title: body.Title,
IsExpanded: body.IsExpanded,
})
c.Out.WriteHeader(http.StatusOK)
} else if c.Req.Method == "DELETE" {
s.db.DeleteFolder(id)

View File

@@ -38,20 +38,27 @@ func (s *Storage) DeleteFolder(folderId int64) bool {
return err == nil
}
func (s *Storage) RenameFolder(folderId int64, newTitle string) bool {
_, err := s.db.Exec(`update folders set title = :title where id = :id`,
sql.Named("title", newTitle),
sql.Named("id", folderId),
)
return err == nil
type UpdateFolderParams struct {
Title *string
IsExpanded *bool
}
func (s *Storage) ToggleFolderExpanded(folderId int64, isExpanded bool) bool {
_, err := s.db.Exec(`update folders set is_expanded = :is_expanded where id = :id`,
sql.Named("is_expanded", isExpanded),
func (s *Storage) UpdateFolder(folderId int64, params UpdateFolderParams) (bool, error) {
_, err := s.db.Exec(`
update folders set
title = coalesce(:title, title),
is_expanded = coalesce(:is_expanded, is_expanded)
where id = :id
`,
sql.Named("id", folderId),
sql.Named("title", params.Title),
sql.Named("is_expanded", params.IsExpanded),
)
return err == nil
if err != nil {
log.Print(err)
return false, err
}
return true, nil
}
func (s *Storage) ListFolders() []Folder {

View File

@@ -0,0 +1,78 @@
package storage
import (
"testing"
)
func TestUpdateFolder(t *testing.T) {
db := testDB()
folder := db.CreateFolder("old title")
if folder.IsExpanded != true {
t.Fatal("expected folder to be expanded by default")
}
t.Run("rename only", func(t *testing.T) {
newTitle := "new title"
ok, err := db.UpdateFolder(folder.Id, UpdateFolderParams{
Title: &newTitle,
})
if !ok || err != nil {
t.Fatalf("UpdateFolder failed: %v", err)
}
folders := db.ListFolders()
if len(folders) != 1 || folders[0].Title != "new title" {
t.Errorf("expected title to be updated, got %s", folders[0].Title)
}
if folders[0].IsExpanded != true {
t.Error("expected expansion state to remain unchanged")
}
})
t.Run("toggle expanded only", func(t *testing.T) {
isExpanded := false
ok, err := db.UpdateFolder(folder.Id, UpdateFolderParams{
IsExpanded: &isExpanded,
})
if !ok || err != nil {
t.Fatalf("UpdateFolder failed: %v", err)
}
folders := db.ListFolders()
if len(folders) != 1 || folders[0].IsExpanded != false {
t.Errorf("expected is_expanded to be false, got %v", folders[0].IsExpanded)
}
if folders[0].Title != "new title" {
t.Error("expected title to remain unchanged")
}
})
t.Run("update both", func(t *testing.T) {
bothTitle := "both"
isExpanded := true
ok, err := db.UpdateFolder(folder.Id, UpdateFolderParams{
Title: &bothTitle,
IsExpanded: &isExpanded,
})
if !ok || err != nil {
t.Fatalf("UpdateFolder failed: %v", err)
}
folders := db.ListFolders()
if len(folders) != 1 || folders[0].Title != "both" || folders[0].IsExpanded != true {
t.Errorf("expected both to be updated, got title=%s expanded=%v", folders[0].Title, folders[0].IsExpanded)
}
})
t.Run("update none", func(t *testing.T) {
ok, err := db.UpdateFolder(folder.Id, UpdateFolderParams{})
if !ok || err != nil {
t.Fatalf("UpdateFolder failed: %v", err)
}
folders := db.ListFolders()
if len(folders) != 1 || folders[0].Title != "both" || folders[0].IsExpanded != true {
t.Errorf("expected no changes, got title=%s expanded=%v", folders[0].Title, folders[0].IsExpanded)
}
})
}