verstak/cmd/verstak/node_cmd.go

142 lines
3.4 KiB
Go

// 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 <command> [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
}