// Command helpers for the node subcommand. package main import ( "fmt" "path/filepath" "verstak/internal/core/nodes" "verstak/internal/core/storage" ) func runNodeCreate(vault, parentID, typ, title string) error { dbPath := filepath.Join(vault, ".verstak", "index.db") db, err := storage.Open(dbPath) if err != nil { return fmt.Errorf("open db: %v", err) } defer db.Close() repo := nodes.NewRepository(db) var pid *string if parentID != "" { pid = &parentID } n, err := repo.Create(pid, typ, title, 0, "", "") if err != nil { return err } fmt.Printf("created\t%s\t%s\t%s\n", n.ID, n.Type, n.Title) return nil } func runNodeGet(vault, id string) error { dbPath := filepath.Join(vault, ".verstak", "index.db") db, err := storage.Open(dbPath) if err != nil { return fmt.Errorf("open db: %v", err) } defer db.Close() repo := nodes.NewRepository(db) n, err := repo.GetActive(id) if err != nil { return err } fmt.Printf("id=%s\n", n.ID) fmt.Printf("parent=%v\n", ptrStr(n.ParentID)) fmt.Printf("type=%s\n", n.Type) fmt.Printf("title=%s\n", n.Title) fmt.Printf("slug=%s\n", n.Slug) fmt.Printf("revision=%d\n", n.Revision) fmt.Printf("created=%s\n", n.CreatedAt) fmt.Printf("updated=%s\n", n.UpdatedAt) meta, _ := repo.MetaList(n.ID) for _, m := range meta { fmt.Printf("meta:%s=%s\n", m.Key, m.Value) } return nil } func runNodeList(vault, parentID string) error { dbPath := filepath.Join(vault, ".verstak", "index.db") db, err := storage.Open(dbPath) if err != nil { return fmt.Errorf("open db: %v", err) } defer db.Close() repo := nodes.NewRepository(db) var list []nodes.Node if parentID == "" { list, err = repo.ListRoots(false) } else { list, err = repo.ListChildren(parentID, false) } if err != nil { return err } for _, n := range list { fmt.Printf("%s\t%s\t%s\n", n.ID, n.Type, n.Title) } return nil } func runNodeMove(vault, id, parentID string, sortOrder int) error { dbPath := filepath.Join(vault, ".verstak", "index.db") db, err := storage.Open(dbPath) if err != nil { return fmt.Errorf("open db: %v", err) } defer db.Close() repo := nodes.NewRepository(db) var pid *string if parentID != "" { pid = &parentID } if err := repo.Move(id, pid, sortOrder); err != nil { return err } fmt.Println("moved") return nil } func runNodeDelete(vault, id string) error { dbPath := filepath.Join(vault, ".verstak", "index.db") db, err := storage.Open(dbPath) if err != nil { return fmt.Errorf("open db: %v", err) } defer db.Close() repo := nodes.NewRepository(db) if err := repo.SoftDelete(id); err != nil { return err } fmt.Println("deleted") return nil } func nodeUsage() { fmt.Println("verstak node — manage nodes in the vault") fmt.Println() fmt.Println("Usage: verstak node [options]") fmt.Println() fmt.Println("Commands:") fmt.Println(" create --type TYPE --title TITLE [--parent ID] Create a node") fmt.Println(" list [--parent ID] List root or children") fmt.Println(" get --id ID Show node details") fmt.Println(" move --id ID [--parent ID] [--sort N] Move node") fmt.Println(" delete --id ID Soft-delete node") fmt.Println() fmt.Println("Types: space, case, folder, note, document, file, action, recipe, secret, worklog, link") } func ptrStr(p *string) string { if p == nil { return "" } return *p }