refactor: clean up NodeService interface; move all integrity logic behind it
This commit is contained in:
141
cmd/update.go
141
cmd/update.go
@@ -1,20 +1,19 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"axolotl/models"
|
||||
"axolotl/output"
|
||||
"axolotl/service"
|
||||
"fmt"
|
||||
"os"
|
||||
"slices"
|
||||
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var (
|
||||
uTitle, uContent, uDue string
|
||||
uClearDue bool
|
||||
uAddTags, uRmTags, uAddRels, uRmRels []string
|
||||
uTitle, uContent, uDue string
|
||||
uClearDue bool
|
||||
uStatus, uPrio, uType, uNamespace, uAssignee string
|
||||
uAddTags, uRmTags, uAddRels, uRmRels []string
|
||||
)
|
||||
|
||||
var updateCmd = &cobra.Command{
|
||||
@@ -26,106 +25,80 @@ var updateCmd = &cobra.Command{
|
||||
return
|
||||
}
|
||||
|
||||
node, err := svc.GetByID(args[0])
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, "node not found:", args[0])
|
||||
return
|
||||
input := service.UpdateInput{
|
||||
AddTags: uAddTags,
|
||||
RemoveTags: uRmTags,
|
||||
}
|
||||
|
||||
// parse relations
|
||||
addRels, rmRels := make(map[models.RelType][]string), make(map[models.RelType][]string)
|
||||
parseRel := func(src []string, dst map[models.RelType][]string) bool {
|
||||
for _, r := range src {
|
||||
rel, err := parseRelFlag(svc, r)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
return false
|
||||
}
|
||||
dst[rel.Type] = append(dst[rel.Type], rel.Target)
|
||||
}
|
||||
return true
|
||||
}
|
||||
if !parseRel(uAddRels, addRels) || !parseRel(uRmRels, rmRels) {
|
||||
return
|
||||
}
|
||||
|
||||
// enforce blocking of tasks
|
||||
//TODO: mabye part of the backend?
|
||||
if slices.Contains(uAddTags, "_status::done") {
|
||||
ok, blockers, err := svc.CanClose(args[0])
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, "failed to check blockers:", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
if !ok {
|
||||
fmt.Fprintf(os.Stderr, "cannot close: blocked by %v\n", blockers)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
// update main fields
|
||||
if cmd.Flags().Changed("title") {
|
||||
node.Title = uTitle
|
||||
input.Title = &uTitle
|
||||
}
|
||||
if cmd.Flags().Changed("content") {
|
||||
node.Content = uContent
|
||||
input.Content = &uContent
|
||||
}
|
||||
if cmd.Flags().Changed("due") {
|
||||
node.DueDate = uDue
|
||||
input.DueDate = &uDue
|
||||
}
|
||||
if uClearDue {
|
||||
node.DueDate = ""
|
||||
empty := ""
|
||||
input.DueDate = &empty
|
||||
}
|
||||
if cmd.Flags().Changed("status") {
|
||||
input.Status = &uStatus
|
||||
}
|
||||
if cmd.Flags().Changed("prio") {
|
||||
input.Priority = &uPrio
|
||||
}
|
||||
if cmd.Flags().Changed("type") {
|
||||
input.Type = &uType
|
||||
}
|
||||
if cmd.Flags().Changed("namespace") {
|
||||
input.Namespace = &uNamespace
|
||||
}
|
||||
if cmd.Flags().Changed("assignee") {
|
||||
input.Assignee = &uAssignee
|
||||
}
|
||||
|
||||
// udpate tags
|
||||
for _, t := range uRmTags {
|
||||
if err := node.RemoveTag(t); err != nil {
|
||||
fmt.Fprintln(os.Stderr, "failed to remove tag:", err)
|
||||
for _, r := range uAddRels {
|
||||
ri, err := parseRelInput(r)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
return
|
||||
}
|
||||
input.AddRels = append(input.AddRels, ri)
|
||||
}
|
||||
for _, t := range uAddTags {
|
||||
node.AddTag(t)
|
||||
for _, r := range uRmRels {
|
||||
ri, err := parseRelInput(r)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
return
|
||||
}
|
||||
input.RemoveRels = append(input.RemoveRels, ri)
|
||||
}
|
||||
|
||||
// update relations
|
||||
for rt, tgts := range rmRels {
|
||||
for _, tgt := range tgts {
|
||||
if err := node.RemoveRelation(rt, tgt); err != nil {
|
||||
fmt.Fprintln(os.Stderr, "failed to remove relation:", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
for rt, tgts := range addRels {
|
||||
for _, tgt := range tgts {
|
||||
node.AddRelation(rt, tgt)
|
||||
}
|
||||
}
|
||||
|
||||
// persist update
|
||||
if err := svc.Update(node); err != nil {
|
||||
fmt.Fprintln(os.Stderr, "failed to update:", err)
|
||||
return
|
||||
}
|
||||
if n, err := svc.GetByID(args[0]); err == nil {
|
||||
output.PrintNode(cmd.OutOrStdout(), svc, n, jsonFlag)
|
||||
} else {
|
||||
fmt.Fprintln(os.Stderr, "failed to fetch node:", err)
|
||||
n, err := svc.Update(args[0], input)
|
||||
if err != nil {
|
||||
fmt.Fprintln(os.Stderr, err)
|
||||
os.Exit(1)
|
||||
}
|
||||
output.PrintNode(cmd.OutOrStdout(), svc, n, jsonFlag)
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
rootCmd.AddCommand(updateCmd)
|
||||
addPropertyFlags(updateCmd)
|
||||
f := updateCmd.Flags()
|
||||
f.StringVar(&uTitle, "title", "", "")
|
||||
f.StringVar(&uContent, "content", "", "")
|
||||
f.StringVar(&uDue, "due", "", "")
|
||||
f.BoolVar(&uClearDue, "clear-due", false, "")
|
||||
f.StringArrayVar(&uAddTags, "tag", nil, "")
|
||||
f.StringArrayVar(&uRmTags, "tag-remove", nil, "")
|
||||
f.StringArrayVar(&uAddRels, "rel", nil, "")
|
||||
f.StringArrayVar(&uRmRels, "rel-remove", nil, "")
|
||||
f.StringVar(&uTitle, "title", "", "new title")
|
||||
f.StringVar(&uContent, "content", "", "new content")
|
||||
f.StringVar(&uDue, "due", "", "due date")
|
||||
f.BoolVar(&uClearDue, "clear-due", false, "clear due date")
|
||||
f.StringVar(&uStatus, "status", "", "status (open, done)")
|
||||
f.StringVar(&uPrio, "prio", "", "priority (high, medium, low)")
|
||||
f.StringVar(&uType, "type", "", "node type")
|
||||
f.StringVar(&uNamespace, "namespace", "", "namespace name or ID")
|
||||
f.StringVar(&uAssignee, "assignee", "", "assignee username or ID")
|
||||
f.StringArrayVar(&uAddTags, "tag", nil, "add tags")
|
||||
f.StringArrayVar(&uRmTags, "tag-remove", nil, "remove tags")
|
||||
f.StringArrayVar(&uAddRels, "rel", nil, "add relations (type:target)")
|
||||
f.StringArrayVar(&uRmRels, "rel-remove", nil, "remove relations (type:target)")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user