From 339a489cc85ff7998c99758bd281f3b2fcf82c43 Mon Sep 17 00:00:00 2001 From: Krystian Panek Date: Wed, 8 Feb 2023 14:26:49 +0100 Subject: [PATCH 1/2] Node children command --- cmd/aem/repo.go | 38 ++++++++++++++++++++++++++++++++------ pkg/repo_node.go | 9 ++++++--- 2 files changed, 38 insertions(+), 9 deletions(-) diff --git a/cmd/aem/repo.go b/cmd/aem/repo.go index cd25b38c..bc48577b 100644 --- a/cmd/aem/repo.go +++ b/cmd/aem/repo.go @@ -23,14 +23,15 @@ func (c *CLI) repoNodeCmd() *cobra.Command { Use: "node", Short: "CRUD operations on JCR repository", } - cmd.AddCommand(c.repoNodeRead()) - cmd.AddCommand(c.repoNodeSave()) - cmd.AddCommand(c.repoNodeDelete()) + cmd.AddCommand(c.repoNodeReadCmd()) + cmd.AddCommand(c.repoNodeSaveCmd()) + cmd.AddCommand(c.repoNodeDeleteCmd()) + cmd.AddCommand(c.repoNodeChildrenCmd()) return cmd } -func (c *CLI) repoNodeRead() *cobra.Command { +func (c *CLI) repoNodeReadCmd() *cobra.Command { cmd := &cobra.Command{ Use: "read", Short: "Read node", @@ -50,7 +51,32 @@ func (c *CLI) repoNodeRead() *cobra.Command { return cmd } -func (c *CLI) repoNodeSave() *cobra.Command { +func (c *CLI) repoNodeChildrenCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "children", + Short: "Read node children", + Aliases: []string{"ls"}, + Run: func(cmd *cobra.Command, args []string) { + instance, err := c.aem.InstanceManager().One() + if err != nil { + c.Error(err) + return + } + node := repoNodeByFlags(cmd, *instance) + children, err := node.Children() + if err != nil { + c.Error(err) + return + } + c.SetOutput("children", children) + c.Ok("node children read") + }, + } + repoNodeDefineFlags(cmd) + return cmd +} + +func (c *CLI) repoNodeSaveCmd() *cobra.Command { cmd := &cobra.Command{ Use: "save", Short: "Create or update node", @@ -95,7 +121,7 @@ func (c *CLI) repoNodeSave() *cobra.Command { return cmd } -func (c *CLI) repoNodeDelete() *cobra.Command { +func (c *CLI) repoNodeDeleteCmd() *cobra.Command { cmd := &cobra.Command{ Use: "delete", Short: "Delete node", diff --git a/pkg/repo_node.go b/pkg/repo_node.go index 86434bc5..c5c34637 100644 --- a/pkg/repo_node.go +++ b/pkg/repo_node.go @@ -9,6 +9,7 @@ import ( "github.com/wttech/aemc/pkg/common/langx" "github.com/wttech/aemc/pkg/common/stringsx" "golang.org/x/exp/maps" + "strings" ) // RepoNode represents single node in JCR repository @@ -80,7 +81,7 @@ func (n RepoNode) Breadcrumb() []RepoNode { } func (n RepoNode) Child(name string) RepoNode { - return NewNode(n.repo, fmt.Sprintf("%s/%s", n.path, name)) + return NewNode(n.repo, fmt.Sprintf("%s/%s", strings.TrimPrefix(n.path, "/"), name)) } func (n RepoNode) Children() ([]RepoNode, error) { @@ -95,7 +96,8 @@ func (n RepoNode) Children() ([]RepoNode, error) { if err != nil { return nil, fmt.Errorf("cannot parse children of node '%s': %w", n.path, err) } - return lo.Map(children.Children, func(child nodeArrayChild, _ int) RepoNode { return n.Child(child.Name) }), nil + childrenWithType := lo.Filter(children.Children, func(c nodeArrayChild, _ int) bool { return c.PrimaryType != "" }) + return lo.Map(childrenWithType, func(child nodeArrayChild, _ int) RepoNode { return n.Child(child.Name) }), nil } type nodeArrayChildren struct { @@ -103,7 +105,8 @@ type nodeArrayChildren struct { } type nodeArrayChild struct { - Name string `json:"__name__"` + Name string `json:"__name__"` + PrimaryType string `json:"jcr:primaryType,omitempty"` } func (n RepoNode) Siblings() ([]RepoNode, error) { From a76480d11216031ea54e804deb48187470abf87c Mon Sep 17 00:00:00 2001 From: Krystian Panek Date: Wed, 8 Feb 2023 14:49:59 +0100 Subject: [PATCH 2/2] Repo node children / nice path list sorted --- cmd/aem/repo.go | 2 +- pkg/repo.go | 26 ++++++++++++++++++++++++++ pkg/repo_node.go | 4 ++-- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/cmd/aem/repo.go b/cmd/aem/repo.go index bc48577b..4fc37e3e 100644 --- a/cmd/aem/repo.go +++ b/cmd/aem/repo.go @@ -68,7 +68,7 @@ func (c *CLI) repoNodeChildrenCmd() *cobra.Command { c.Error(err) return } - c.SetOutput("children", children) + c.SetOutput("children", pkg.NewRepoNodeList(children)) c.Ok("node children read") }, } diff --git a/pkg/repo.go b/pkg/repo.go index 872d7eb8..d94e241d 100644 --- a/pkg/repo.go +++ b/pkg/repo.go @@ -1,14 +1,18 @@ package pkg import ( + "bytes" "fmt" "github.com/go-resty/resty/v2" + "github.com/samber/lo" log "github.com/sirupsen/logrus" "github.com/wttech/aemc/pkg/common/fmtx" "github.com/wttech/aemc/pkg/common/mapsx" "github.com/wttech/aemc/pkg/repo" "net/http" "reflect" + "sort" + "strings" ) // Repo Facade for communicating with JCR repository. @@ -140,3 +144,25 @@ func (r Repo) handleResponse(action string, resp *resty.Response, err error) err } return nil } + +func NewRepoNodeList(nodes []RepoNode) NodeList { + var sortedNodes []RepoNode + sortedNodes = append(sortedNodes, nodes...) + sort.SliceStable(sortedNodes, func(i, j int) bool { return strings.Compare(nodes[i].Name(), nodes[j].Name()) < 0 }) + return NodeList{Nodes: sortedNodes, Total: len(nodes)} +} + +type NodeList struct { + Total int `json:"total" yaml:"total"` + Nodes []RepoNode `json:"nodes" yaml:"nodes"` +} + +func (nl NodeList) MarshalText() string { + bs := bytes.NewBufferString("") + bs.WriteString(fmtx.TblMap("stats", "stat", "value", map[string]any{"total": len(nl.Nodes)})) + bs.WriteString("\n") + bs.WriteString(fmtx.TblRows("list", true, []string{"path"}, lo.Map(nl.Nodes, func(node RepoNode, _ int) map[string]any { + return map[string]any{"path": node.path} + }))) + return bs.String() +} diff --git a/pkg/repo_node.go b/pkg/repo_node.go index c5c34637..5461c1eb 100644 --- a/pkg/repo_node.go +++ b/pkg/repo_node.go @@ -22,7 +22,7 @@ type RepoNode struct { func NewNode(repo Repo, path string) RepoNode { return RepoNode{ repo: repo, - path: path, + path: "/" + strings.Trim(path, "/"), } } @@ -81,7 +81,7 @@ func (n RepoNode) Breadcrumb() []RepoNode { } func (n RepoNode) Child(name string) RepoNode { - return NewNode(n.repo, fmt.Sprintf("%s/%s", strings.TrimPrefix(n.path, "/"), name)) + return NewNode(n.repo, fmt.Sprintf("%s/%s", n.path, name)) } func (n RepoNode) Children() ([]RepoNode, error) {