forked from glennliao/apijson-go
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutil.go
More file actions
executable file
·131 lines (111 loc) · 3.36 KB
/
util.go
File metadata and controls
executable file
·131 lines (111 loc) · 3.36 KB
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package query
import (
"net/http"
"strings"
"github.com/glennliao/apijson-go/config"
"github.com/glennliao/apijson-go/consts"
"github.com/glennliao/apijson-go/model"
"github.com/gogf/gf/v2/container/gset"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
"github.com/samber/lo"
)
// parseQueryNodeReq 解析节点请求内容
func parseQueryNodeReq(reqMap model.Map, isList bool) (refMap model.MapStrStr, where model.MapStrAny, ctrlMap model.Map) {
refMap = model.MapStrStr{}
ctrlMap = model.Map{}
where = model.MapStrAny{}
for k, v := range reqMap {
if strings.HasSuffix(k, consts.FunctionsKeySuffix) {
continue
}
if strings.HasSuffix(k, consts.RefKeySuffix) { // 引用
refMap[k[0:len(k)-1]] = gconv.String(v)
} else if strings.HasPrefix(k, consts.CtrlKeyPrefix) { // @column等ctrl字段
ctrlMap[k] = v
} else {
if isList {
switch k {
case consts.Page, consts.Count, consts.Query:
// 分页字段不传递到sqlExecutor
continue
}
}
where[k] = v
}
}
return
}
func hasAccess(node *Node) (hasAccess bool, condition *config.ConditionRet, err error) {
accessRoles := node.executorConfig.AccessRoles()
if err != nil {
return false, nil, err
}
if !lo.Contains(accessRoles, node.role) {
g.Log().Debug(node.ctx, node.Key, "role:", node.role, "accessRole", accessRoles, " -> deny")
return false, nil, err
}
condition = config.NewConditionRet()
_req := model.Map{}
for k, v := range node.req {
if !strings.HasSuffix(k, consts.FunctionsKeySuffix) && !strings.HasSuffix(k, consts.RefKeySuffix) && !strings.HasPrefix(k, consts.CtrlKeyPrefix) {
k = node.queryContext.DbFieldStyle(node.ctx, node.Key, k)
}
_req[k] = v
}
node.req = _req
err = node.queryContext.AccessCondition(node.ctx, config.ConditionReq{
AccessName: node.Key,
TableAccessRoleList: accessRoles,
Method: http.MethodGet,
NodeReq: node.req,
NodeRole: node.role,
}, condition)
return true, condition, err
}
func getColList(list []model.Map, col string) []any {
set := gset.New()
for _, item := range list {
set.Add(gconv.String(item[col]))
}
return set.Slice()
}
func setNeedTotal(node *Node) {
node.needTotal = true
if node.Type == NodeTypeStruct {
setNeedTotal(node.children[node.primaryTableKey])
}
}
// setNodeRole 设置节点的@role, 根据 config.DefaultRoleFunc 获取节点最终的@role
func setNodeRole(node *Node, tableName string, parenNodeRole string) {
role, ok := node.req[consts.Role]
if node.Type != NodeTypeQuery {
if !ok {
node.role = parenNodeRole
} else {
node.role = gconv.String(role)
}
} else {
if ok {
node.role, _ = node.queryContext.queryConfig.DefaultRoleFunc()(node.ctx, config.RoleReq{
AccessName: tableName,
NodeRole: gconv.String(role),
})
} else {
node.role, _ = node.queryContext.queryConfig.DefaultRoleFunc()(node.ctx, config.RoleReq{
AccessName: tableName,
NodeRole: parenNodeRole,
})
}
}
}
// analysisRef 分析依赖, 将依赖关系保存到prerequisites中
func analysisRef(p *Node, prerequisites *[][]string) {
// 分析依赖关系, 让无依赖的先执行, 然后在执行后续的
for _, node := range p.children {
for _, refNode := range node.refKeyMap {
*prerequisites = append(*prerequisites, []string{node.Path, refNode.node.Path})
}
analysisRef(node, prerequisites)
}
}