From 2b9d7ea9e70f7e11d7c1085563edcc4a64455170 Mon Sep 17 00:00:00 2001 From: Cristian Vidmar Date: Mon, 16 Mar 2020 18:02:25 +0100 Subject: [PATCH] ExposeHiddenNodes in request --- content/item.go | 1 + content/reponode.go | 1 + go.mod | 1 + go.sum | 11 +++++++ repo/mock/repo-ok-exposehidden.json | 51 +++++++++++++++++++++++++++++ repo/repo.go | 17 +++++++--- repo/repo_test.go | 18 ++++++++++ requests/requests.go | 2 ++ 8 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 repo/mock/repo-ok-exposehidden.json diff --git a/content/item.go b/content/item.go index fc96a09..ec8c8fa 100644 --- a/content/item.go +++ b/content/item.go @@ -6,6 +6,7 @@ type Item struct { Name string `json:"name"` URI string `json:"URI"` MimeType string `json:"mimeType"` + Hidden bool `json:"hidden,omitempty"` Data map[string]interface{} `json:"data"` } diff --git a/content/reponode.go b/content/reponode.go index 39f45fd..466feb4 100644 --- a/content/reponode.go +++ b/content/reponode.go @@ -81,6 +81,7 @@ func (node *RepoNode) ToItem(dataFields []string) *Item { item.ID = node.ID item.Name = node.Name item.MimeType = node.MimeType + item.Hidden = node.Hidden item.URI = node.URI if dataFields == nil { item.Data = node.Data diff --git a/go.mod b/go.mod index f6b1ecd..2bf99bb 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/modern-go/reflect2 v1.0.1 // indirect github.com/pkg/errors v0.8.1 // indirect github.com/prometheus/client_golang v0.9.2 + github.com/stretchr/testify v1.5.1 go.uber.org/atomic v1.4.0 // indirect go.uber.org/multierr v1.1.0 // indirect go.uber.org/zap v1.10.0 diff --git a/go.sum b/go.sum index 9ffb36c..955f0bd 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,7 @@ github.com/apex/log v1.1.0 h1:J5rld6WVFi6NxA6m8GJ1LJqu3+GiTFIt3mYv27gdQWI= github.com/apex/log v1.1.0/go.mod h1:yA770aXIDQrhVOIGurT/pVdfCpSq1GQV/auzMN5fzvY= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= @@ -16,6 +17,8 @@ github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.2 h1:awm861/B8OKDd2I/6o1dy3ra4BamzKhYOiGItCeZ740= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8= @@ -24,6 +27,9 @@ github.com/prometheus/common v0.0.0-20181126121408-4724e9255275 h1:PnBWHBf+6L0jO github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a h1:9a8MnZMP0X2nLJdBg+pBmGgkJlSaKC2KaQmTCk1XDtE= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= @@ -31,4 +37,9 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/repo/mock/repo-ok-exposehidden.json b/repo/mock/repo-ok-exposehidden.json new file mode 100644 index 0000000..c736c78 --- /dev/null +++ b/repo/mock/repo-ok-exposehidden.json @@ -0,0 +1,51 @@ +{ + "dimension_foo": { + "id": "id-root", + "name": "root node", + "mimeType": "application\/x-node", + "groups": null, + "URI": "\/", + "hidden": false, + "linkId": null, + "destinationId": null, + "data": { + "foo": "bar" + }, + "index": [ + "id-a", + "id-b" + ], + "nodes": { + "id-a": { + "id": "id-a", + "name": "node a", + "mimeType": "application\/x-node", + "groups": null, + "URI": "\/a", + "hidden": false, + "linkId": null, + "destinationId": null, + "data": { + "baz": 1 + }, + "index": [], + "nodes": {} + }, + "id-b": { + "id": "id-b", + "name": "node b", + "mimeType": "application\/x-node", + "groups": null, + "URI": "\/b", + "hidden": true, + "linkId": null, + "destinationId": null, + "data": { + "b": "b" + }, + "index": [], + "nodes": {} + } + } + } +} \ No newline at end of file diff --git a/repo/repo.go b/repo/repo.go index 719d7e3..7bf302b 100644 --- a/repo/repo.go +++ b/repo/repo.go @@ -137,7 +137,7 @@ func (repo *Repo) getNodes(nodeRequests map[string]*requests.Node, env *requests } treeNode, ok := dimensionNode.Directory[nodeRequest.ID] if ok { - nodes[nodeName] = repo.getNode(treeNode, nodeRequest.Expand, nodeRequest.MimeTypes, path, 0, groups, nodeRequest.DataFields) + nodes[nodeName] = repo.getNode(treeNode, nodeRequest.Expand, nodeRequest.MimeTypes, path, 0, groups, nodeRequest.DataFields, nodeRequest.ExposeHiddenNodes) } else { Log.Error("an invalid tree node was requested", zap.String("nodeName", nodeName), @@ -344,14 +344,23 @@ func (repo *Repo) getURI(dimension string, id string) string { return "" } -func (repo *Repo) getNode(repoNode *content.RepoNode, expanded bool, mimeTypes []string, path []*content.Item, level int, groups []string, dataFields []string) *content.Node { +func (repo *Repo) getNode( + repoNode *content.RepoNode, + expanded bool, + mimeTypes []string, + path []*content.Item, + level int, + groups []string, + dataFields []string, + exposeHiddenNodes bool, +) *content.Node { node := content.NewNode() node.Item = repoNode.ToItem(dataFields) Log.Debug("getNode", zap.String("ID", repoNode.ID)) for _, childID := range repoNode.Index { childNode := repoNode.Nodes[childID] - if (level == 0 || expanded || !expanded && childNode.InPath(path)) && !childNode.Hidden && childNode.CanBeAccessedByGroups(groups) && childNode.IsOneOfTheseMimeTypes(mimeTypes) { - node.Nodes[childID] = repo.getNode(childNode, expanded, mimeTypes, path, level+1, groups, dataFields) + if (level == 0 || expanded || !expanded && childNode.InPath(path)) && (!childNode.Hidden || exposeHiddenNodes) && childNode.CanBeAccessedByGroups(groups) && childNode.IsOneOfTheseMimeTypes(mimeTypes) { + node.Nodes[childID] = repo.getNode(childNode, expanded, mimeTypes, path, level+1, groups, dataFields, exposeHiddenNodes) node.Index = append(node.Index, childID) } } diff --git a/repo/repo_test.go b/repo/repo_test.go index 66ae3b1..54e47e5 100644 --- a/repo/repo_test.go +++ b/repo/repo_test.go @@ -9,6 +9,7 @@ import ( _ "github.com/foomo/contentserver/logger" "github.com/foomo/contentserver/repo/mock" "github.com/foomo/contentserver/requests" + "github.com/stretchr/testify/require" ) func init() { @@ -187,6 +188,23 @@ func TestGetNodes(t *testing.T) { } } +func TestGetNodesExposeHidden(t *testing.T) { + var ( + r = getTestRepo("/repo-ok-exposehidden.json", t) + nodesRequest = mock.MakeNodesRequest() + ) + nodesRequest.Nodes["test"].ExposeHiddenNodes = true + nodes := r.GetNodes(nodesRequest) + testNode, ok := nodes["test"] + if !ok { + t.Fatal("wtf that should be a node") + } + _, ok = testNode.Item.Data["foo"] + if !ok { + t.Fatal("failed to fetch test data") + } + require.Equal(t, 2, len(testNode.Nodes)) +} func TestResolveContent(t *testing.T) { var ( diff --git a/requests/requests.go b/requests/requests.go index eb94f4c..83109ae 100644 --- a/requests/requests.go +++ b/requests/requests.go @@ -20,6 +20,8 @@ type Node struct { MimeTypes []string `json:"mimeTypes"` // expand the navigation tree or just the path to the resolved content Expand bool `json:"expand"` + // Expose hidden nodes + ExposeHiddenNodes bool `json:"exposeHiddenNodes,omitempty"` // filter with these DataFields []string `json:"dataFields"` }