From b3a7d7c9a8e0787610a48fc1d2bb466653dfc18e Mon Sep 17 00:00:00 2001
From: alick-liming <whandlm@163.com>
Date: Wed, 6 Jan 2021 11:14:38 +0800
Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=BB=84=E7=BB=87=E4=B8=8B?=
 =?UTF-8?q?=E6=8B=89=E6=8E=A5=E5=8F=A3=20(#486)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-authored-by: alickliming <alickliming@didi.global.com>
---
 src/models/node_service.go          | 34 +++++++++++++++++++++++++++++
 src/modules/rdb/http/router.go      |  1 +
 src/modules/rdb/http/router_tree.go | 12 ++++++++--
 3 files changed, 45 insertions(+), 2 deletions(-)

diff --git a/src/models/node_service.go b/src/models/node_service.go
index 0093af57..f66ce88e 100644
--- a/src/models/node_service.go
+++ b/src/models/node_service.go
@@ -42,6 +42,7 @@ func TreeUntilProjectsGetByNid(nid int64) ([]Node, error) {
 	return oks, err
 }
 
+// 暂时保留,不知道外部其他组件是否有调用
 func TreeUntilProjectsGetByUser(user *User) ([]Node, error) {
 	ret, err := UserPermNodes(user)
 	if err != nil {
@@ -105,3 +106,36 @@ func UserPermNodes(me *User) ([]Node, error) {
 	ret, err = PermNodes(nodes)
 	return ret, err
 }
+
+func TreeUntilTypGetByUser(user *User, typ string) ([]Node, error) {
+	ret, err := UserPermNodes(user)
+	if err != nil {
+		return ret, err
+	}
+
+	cnt := len(ret)
+	all := make(map[string]Node, cnt)
+	for i := 0; i < cnt; i++ {
+		all[ret[i].Path] = ret[i]
+	}
+
+	// 只取typ(含)以上的部分
+	var oks []Node
+
+	set := make(map[string]struct{})
+	for i := 0; i < cnt; i++ {
+		if ret[i].Cate == typ {
+			paths := Paths(ret[i].Path)
+			for _, path := range paths {
+				if _, has := set[path]; has {
+					continue
+				}
+
+				set[path] = struct{}{}
+				oks = append(oks, all[path])
+			}
+		}
+	}
+
+	return oks, err
+}
diff --git a/src/modules/rdb/http/router.go b/src/modules/rdb/http/router.go
index cc4b0269..f0222b0c 100644
--- a/src/modules/rdb/http/router.go
+++ b/src/modules/rdb/http/router.go
@@ -137,6 +137,7 @@ func Config(r *gin.Engine) {
 
 		userLogin.GET("/tree", treeUntilLeafGets)
 		userLogin.GET("/tree/projs", treeUntilProjectGets)
+		userLogin.GET("/tree/orgs", treeUntilOrganizationGets)
 
 		userLogin.GET("/resources/search", resourceSearchGet)
 		userLogin.PUT("/resources/note", resourceNotePut)
diff --git a/src/modules/rdb/http/router_tree.go b/src/modules/rdb/http/router_tree.go
index aa7b67f8..b2684264 100644
--- a/src/modules/rdb/http/router_tree.go
+++ b/src/modules/rdb/http/router_tree.go
@@ -144,7 +144,7 @@ func v1treeUntilProjectGetsByNid(c *gin.Context) {
 // 这个方法,展示的树只到project,节点搜索功能放到前台去
 func treeUntilProjectGets(c *gin.Context) {
 	me := loginUser(c)
-	oks, err := models.TreeUntilProjectsGetByUser(me)
+	oks, err := models.TreeUntilTypGetByUser(me, "project")
 
 	renderData(c, oks, err)
 }
@@ -155,7 +155,15 @@ func v1TreeUntilProjectGets(c *gin.Context) {
 	user, err := models.UserGet("username=?", username)
 	dangerous(err)
 
-	oks, err := models.TreeUntilProjectsGetByUser(user)
+	oks, err := models.TreeUntilTypGetByUser(user, "project")
+
+	renderData(c, oks, err)
+}
+
+// 这个方法,展示的树只到organization
+func treeUntilOrganizationGets(c *gin.Context) {
+	me := loginUser(c)
+	oks, err := models.TreeUntilTypGetByUser(me, "organization")
 
 	renderData(c, oks, err)
 }