-
-
Notifications
You must be signed in to change notification settings - Fork 201
/
filter.go
67 lines (61 loc) · 1.39 KB
/
filter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package navigate
import "github.com/webx-top/echo"
type Checker interface {
Check(echo.Context, string) bool
}
func NewFilter(checker Checker) *Filter {
return &Filter{
Checker: checker,
}
}
type Filter struct {
Checker
}
//FilterNavigate 过滤导航菜单,只显示有权限的菜单
func (r *Filter) FilterNavigate(ctx echo.Context, navList *List) List {
var result List
if navList == nil {
return result
}
for _, nav := range *navList {
children := r.filterNavigateChidren(ctx, nav.Action, nav, nav.Children)
if children == nil {
continue
}
navCopy := *nav
navCopy.Children = children
result = append(result, &navCopy)
}
return result
}
func (r *Filter) filterNavigateChidren(ctx echo.Context, permPath string, parent *Item, children *List) *List {
if children == nil {
if !parent.Unlimited && !r.Check(ctx, permPath) {
return nil
}
return &List{}
}
newChildren := List{}
for _, child := range *children {
var perm string
if len(child.Action) > 0 {
perm = permPath + `/` + child.Action
} else {
perm = permPath
}
list := r.filterNavigateChidren(ctx, perm, child, child.Children)
if list == nil {
continue
}
childCopy := *child
childCopy.Children = list
newChildren = append(newChildren, &childCopy)
}
if parent.Unlimited {
return &newChildren
}
if len(newChildren) == 0 && !r.Check(ctx, permPath) {
return nil
}
return &newChildren
}