Skip to content

Commit 8ea7a4e

Browse files
committed
实现 从其它源提供access和request等配置
1 parent dd61ada commit 8ea7a4e

File tree

8 files changed

+175
-136
lines changed

8 files changed

+175
-136
lines changed

config/config.go

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,31 @@
11
package config
22

3+
import "context"
4+
5+
type AccessListProvider func(ctx context.Context) []AccessConfig
6+
7+
var accessListProviderMap = make(map[string]AccessListProvider)
8+
9+
func RegAccessListProvider(name string, provider AccessListProvider) {
10+
accessListProviderMap[name] = provider
11+
}
12+
13+
type RequestListProvider func(ctx context.Context) []Request
14+
15+
var requestListProviderMap = make(map[string]RequestListProvider)
16+
17+
func RegRequestListProvider(name string, provider RequestListProvider) {
18+
requestListProviderMap[name] = provider
19+
}
20+
21+
type DbMetaProvider func(ctx context.Context) []Table
22+
23+
var dbMetaProviderMap = make(map[string]DbMetaProvider)
24+
25+
func RegDbMetaProvider(name string, provider DbMetaProvider) {
26+
dbMetaProviderMap[name] = provider
27+
}
28+
329
type Config struct {
430
Access *Access
531

@@ -18,7 +44,11 @@ type Config struct {
1844

1945
DbMeta *DBMeta
2046

21-
AccessList []AccessConfig // todo to access
47+
AccessListProvider string
48+
RequestListProvider string
49+
DbMetaProvider string
50+
51+
accessList []AccessConfig // todo to access
2252

2353
RequestConfig *RequestConfig
2454

@@ -28,6 +58,9 @@ type Config struct {
2858
func New() *Config {
2959
a := &Config{}
3060
a.Access = NewAccess()
61+
a.AccessListProvider = "db"
62+
a.RequestListProvider = "db"
63+
a.DbMetaProvider = "db"
3164

3265
a.MaxTreeWidth = 5
3366
a.MaxTreeDeep = 5
@@ -47,14 +80,30 @@ func (c *Config) Load() {
4780

4881
c.Access.accessConfigMap = make(map[string]AccessConfig)
4982

50-
for _, access := range c.AccessList {
83+
ctx := context.Background()
5184

52-
name := access.Alias
53-
if name == "" {
54-
name = access.Name
85+
accessListProvider := accessListProviderMap[c.AccessListProvider]
86+
87+
if accessListProvider != nil {
88+
c.accessList = accessListProvider(ctx)
89+
for _, access := range c.accessList {
90+
name := access.Alias
91+
if name == "" {
92+
name = access.Name
93+
}
94+
c.Access.accessConfigMap[access.Alias] = access
5595
}
96+
}
97+
98+
requestListProvider := requestListProviderMap[c.RequestListProvider]
99+
if requestListProvider != nil {
100+
requestList := requestListProvider(ctx)
101+
c.RequestConfig = NewRequestConfig(requestList)
102+
}
56103

57-
c.Access.accessConfigMap[access.Alias] = access
104+
dbMetaProvider := dbMetaProviderMap[c.DbMetaProvider]
105+
if dbMetaProvider != nil {
106+
c.DbMeta = NewDbMeta(dbMetaProvider(ctx))
58107
}
59108

60109
c.queryConfig = &QueryConfig{

config/functions.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ func (f *Functions) Bind(name string, _func Func) {
2222
f.funcMap[name] = _func
2323
}
2424

25-
// ?
2625
func (f *Functions) BindHandlerFunc(name string, handler func(ctx context.Context, param model.Map) (res any, err error)) {
2726
if _, exists := f.funcMap[name]; exists {
2827
panic(fmt.Errorf(" function %s has exists", name))

drivers/config/goframe/config.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package goframe
2+
3+
import (
4+
"context"
5+
"github.com/glennliao/apijson-go/config"
6+
"github.com/gogf/gf/v2/frame/g"
7+
"strings"
8+
)
9+
10+
func init() {
11+
config.RegAccessListProvider("db", func(ctx context.Context) []config.AccessConfig {
12+
// access
13+
var accessList []config.AccessConfig
14+
15+
db := g.DB()
16+
17+
err := db.Model("_access").Scan(&accessList)
18+
if err != nil {
19+
panic(err)
20+
}
21+
22+
for _, access := range accessList {
23+
if len(access.Get) == 1 {
24+
access.Get = strings.Split(access.Get[0], ",")
25+
}
26+
if len(access.Head) == 1 {
27+
access.Head = strings.Split(access.Head[0], ",")
28+
}
29+
if len(access.Gets) == 1 {
30+
access.Gets = strings.Split(access.Gets[0], ",")
31+
}
32+
if len(access.Heads) == 1 {
33+
access.Heads = strings.Split(access.Heads[0], ",")
34+
}
35+
if len(access.Post) == 1 {
36+
access.Post = strings.Split(access.Post[0], ",")
37+
}
38+
if len(access.Put) == 1 {
39+
access.Put = strings.Split(access.Put[0], ",")
40+
}
41+
if len(access.Delete) == 1 {
42+
access.Delete = strings.Split(access.Delete[0], ",")
43+
}
44+
accessList = append(accessList, access)
45+
}
46+
47+
return accessList
48+
})
49+
50+
config.RegRequestListProvider("db", func(ctx context.Context) []config.Request {
51+
var requestList []config.Request
52+
err := g.DB().Model("_request").OrderAsc("version").Scan(&requestList)
53+
if err != nil {
54+
panic(err)
55+
}
56+
return requestList
57+
})
58+
59+
config.RegDbMetaProvider("db", func(ctx context.Context) []config.Table {
60+
var _tables []config.Table
61+
62+
db := g.DB()
63+
tables, err := db.Tables(ctx)
64+
if err != nil {
65+
panic(err)
66+
}
67+
68+
for _, table := range tables {
69+
fields, err := db.TableFields(ctx, table)
70+
if err != nil {
71+
panic(err)
72+
}
73+
74+
var columns []config.Column
75+
for field, _ := range fields {
76+
columns = append(columns, config.Column{Name: field})
77+
}
78+
79+
_tables = append(_tables, config.Table{
80+
Name: table,
81+
Columns: columns,
82+
})
83+
84+
}
85+
86+
return _tables
87+
})
88+
}

query/node_func.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ func (h *funcNode) fetch() {
2525
functionName, paramKeys := util.ParseFunctionsStr(n.simpleReqVal)
2626
//n.simpleReqVal = functionName
2727
// todo 如何传递参数
28+
2829
param := model.Map{}
2930
for _, key := range paramKeys {
3031
param[key] = n.queryContext.pathNodes[key].simpleReqVal
3132
}
32-
3333
n.ret, n.err = n.queryContext.Functions.Call(n.ctx, functionName, param)
3434
}
3535

query/node_ref.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@ import (
99
"strings"
1010
)
1111

12-
type refNode struct {
12+
type RefNode struct {
1313
node *Node
1414
}
1515

16-
func newRefNode(n *Node) *refNode {
17-
return &refNode{node: n}
16+
func newRefNode(n *Node) *RefNode {
17+
return &RefNode{node: n}
1818
}
1919

20-
func (r *refNode) parse() {
20+
func (r *RefNode) parse() {
2121
n := r.node
2222

2323
refStr := n.simpleReqVal
@@ -46,7 +46,7 @@ func (r *refNode) parse() {
4646
}
4747
}
4848

49-
func (r *refNode) fetch() {
49+
func (r *RefNode) fetch() {
5050
n := r.node
5151
for _, refNode := range n.refKeyMap {
5252
if strings.HasSuffix(refNode.column, "total") && strings.HasSuffix(refNode.node.Path, consts.ListKeySuffix) {
@@ -57,13 +57,13 @@ func (r *refNode) fetch() {
5757
}
5858
}
5959

60-
func (r *refNode) result() {
60+
func (r *RefNode) result() {
6161
n := r.node
6262
if strings.HasSuffix(n.simpleReqVal, "[]/total") {
6363
n.ret = n.total
6464
}
6565
}
6666

67-
func (r *refNode) nodeType() int {
67+
func (r *RefNode) nodeType() int {
6868
return NodeTypeRef
6969
}

test/tt/z_test.go

Lines changed: 0 additions & 29 deletions
This file was deleted.

test/z_app_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"context"
55
"github.com/glennliao/apijson-go"
6+
"github.com/glennliao/apijson-go/config"
67
"github.com/glennliao/apijson-go/config/tables"
78
"github.com/glennliao/apijson-go/model"
89
"github.com/glennliao/table-sync/tablesync"
@@ -25,6 +26,25 @@ type Todo struct {
2526
CreatedAt *time.Time
2627
}
2728

29+
func init() {
30+
config.RegAccessListProvider("db", func(ctx context.Context) []config.AccessConfig {
31+
return []config.AccessConfig{
32+
{
33+
Name: "user",
34+
Alias: "User",
35+
Get: []string{"UNKNOWN"},
36+
RowKey: "id",
37+
},
38+
{
39+
Name: "user",
40+
Alias: "User2",
41+
Get: []string{"UNKNOWN"},
42+
RowKey: "id",
43+
},
44+
}
45+
})
46+
}
47+
2848
func App(ctx context.Context, a *apijson.ApiJson) {
2949

3050
syncer := tablesync.Syncer{
@@ -44,4 +64,6 @@ func App(ctx context.Context, a *apijson.ApiJson) {
4464
return "nihao", nil
4565
}})
4666

67+
a.Config().AccessListProvider = "custom"
68+
4769
}

0 commit comments

Comments
 (0)