|
@@ -18,21 +18,26 @@ type routePermDecl struct {
|
|
|
DataCode string
|
|
DataCode string
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-type fieldPermMap struct {
|
|
|
|
|
- Request map[string]string // json字段名 → permCode
|
|
|
|
|
- Response map[string]string // json字段名 → permCode
|
|
|
|
|
|
|
+type fieldNode struct {
|
|
|
|
|
+ Fields map[string]string
|
|
|
|
|
+ Nested map[string]*fieldNode
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
type collectResult struct {
|
|
type collectResult struct {
|
|
|
perms []permDecl
|
|
perms []permDecl
|
|
|
routePerms []routePermDecl
|
|
routePerms []routePermDecl
|
|
|
- fieldPerms map[string]fieldPermMap // "METHOD /path" → fieldPermMap
|
|
|
|
|
|
|
+ fieldPerms map[string]*fieldPermMap // "METHOD /path" → fieldPermMap
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+type fieldPermMap struct {
|
|
|
|
|
+ Request *fieldNode
|
|
|
|
|
+ Response *fieldNode
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func collect(input *PluginInput) *collectResult {
|
|
func collect(input *PluginInput) *collectResult {
|
|
|
seen := make(map[string]bool)
|
|
seen := make(map[string]bool)
|
|
|
result := &collectResult{
|
|
result := &collectResult{
|
|
|
- fieldPerms: make(map[string]fieldPermMap),
|
|
|
|
|
|
|
+ fieldPerms: make(map[string]*fieldPermMap),
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if input == nil || input.Api == nil {
|
|
if input == nil || input.Api == nil {
|
|
@@ -89,27 +94,23 @@ func collect(input *PluginInput) *collectResult {
|
|
|
DataCode: dataCode,
|
|
DataCode: dataCode,
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
- fm := fieldPermMap{
|
|
|
|
|
- Request: make(map[string]string),
|
|
|
|
|
- Response: make(map[string]string),
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
|
|
+ var reqNode *fieldNode
|
|
|
if route.RequestType != nil {
|
|
if route.RequestType != nil {
|
|
|
- for jsonField, permTag := range extractFieldPermsDeep(route.RequestType, typeIndex) {
|
|
|
|
|
- fm.Request[jsonField] = permTag
|
|
|
|
|
- addPerm(permTag, "")
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ reqNode = collectFieldPerms(route.RequestType.Members, typeIndex)
|
|
|
|
|
+ collectPermCodes(reqNode, addPerm)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ var respNode *fieldNode
|
|
|
if route.ResponseType != nil {
|
|
if route.ResponseType != nil {
|
|
|
- for jsonField, permTag := range extractFieldPermsDeep(route.ResponseType, typeIndex) {
|
|
|
|
|
- fm.Response[jsonField] = permTag
|
|
|
|
|
- addPerm(permTag, "")
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ respNode = collectFieldPerms(route.ResponseType.Members, typeIndex)
|
|
|
|
|
+ collectPermCodes(respNode, addPerm)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if len(fm.Request) > 0 || len(fm.Response) > 0 {
|
|
|
|
|
- result.fieldPerms[key] = fm
|
|
|
|
|
|
|
+ if reqNode != nil || respNode != nil {
|
|
|
|
|
+ result.fieldPerms[key] = &fieldPermMap{
|
|
|
|
|
+ Request: reqNode,
|
|
|
|
|
+ Response: respNode,
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -117,17 +118,12 @@ func collect(input *PluginInput) *collectResult {
|
|
|
return result
|
|
return result
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// extractFieldPermsDeep 递归展开嵌套类型,提取所有 perm tag
|
|
|
|
|
-func extractFieldPermsDeep(t *TypeDef, typeIndex map[string]*TypeDef) map[string]string {
|
|
|
|
|
- result := make(map[string]string)
|
|
|
|
|
- if t == nil {
|
|
|
|
|
- return result
|
|
|
|
|
|
|
+// collectFieldPerms 递归构建 fieldNode 树
|
|
|
|
|
+func collectFieldPerms(members []Member, typeIndex map[string]*TypeDef) *fieldNode {
|
|
|
|
|
+ node := &fieldNode{
|
|
|
|
|
+ Fields: make(map[string]string),
|
|
|
|
|
+ Nested: make(map[string]*fieldNode),
|
|
|
}
|
|
}
|
|
|
- collectFieldPerms(t.Members, typeIndex, result)
|
|
|
|
|
- return result
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func collectFieldPerms(members []Member, typeIndex map[string]*TypeDef, result map[string]string) {
|
|
|
|
|
for _, m := range members {
|
|
for _, m := range members {
|
|
|
jsonName := extractTagValue(m.Tag, "json")
|
|
jsonName := extractTagValue(m.Tag, "json")
|
|
|
if jsonName == "" {
|
|
if jsonName == "" {
|
|
@@ -136,16 +132,34 @@ func collectFieldPerms(members []Member, typeIndex map[string]*TypeDef, result m
|
|
|
|
|
|
|
|
permCode := extractTagValue(m.Tag, "perm")
|
|
permCode := extractTagValue(m.Tag, "perm")
|
|
|
if permCode != "" {
|
|
if permCode != "" {
|
|
|
- result[jsonName] = permCode
|
|
|
|
|
- continue
|
|
|
|
|
|
|
+ node.Fields[jsonName] = permCode
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 没有 perm tag,尝试展开嵌套类型(去掉 [] 前缀)
|
|
|
|
|
rawName := strings.TrimPrefix(m.Type.RawName, "[]")
|
|
rawName := strings.TrimPrefix(m.Type.RawName, "[]")
|
|
|
if nested, ok := typeIndex[rawName]; ok && len(nested.Members) > 0 {
|
|
if nested, ok := typeIndex[rawName]; ok && len(nested.Members) > 0 {
|
|
|
- collectFieldPerms(nested.Members, typeIndex, result)
|
|
|
|
|
|
|
+ child := collectFieldPerms(nested.Members, typeIndex)
|
|
|
|
|
+ if len(child.Fields) > 0 || len(child.Nested) > 0 {
|
|
|
|
|
+ node.Nested[jsonName] = child
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ if len(node.Fields) == 0 && len(node.Nested) == 0 {
|
|
|
|
|
+ return nil
|
|
|
|
|
+ }
|
|
|
|
|
+ return node
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// collectPermCodes 从 fieldNode 树中提取所有 permCode 并注册
|
|
|
|
|
+func collectPermCodes(node *fieldNode, addPerm func(string, string)) {
|
|
|
|
|
+ if node == nil {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ for _, code := range node.Fields {
|
|
|
|
|
+ addPerm(code, "")
|
|
|
|
|
+ }
|
|
|
|
|
+ for _, child := range node.Nested {
|
|
|
|
|
+ collectPermCodes(child, addPerm)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// extractTagValue 从 struct tag 字符串中提取指定 key 的值
|
|
// extractTagValue 从 struct tag 字符串中提取指定 key 的值
|